www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Src/ExtToolControlBar.cpp
//Download by http://www.NewXing.com // This is part of the Professional User Interface Suite library. // Copyright (C) 2001-2004 FOSS Software, Inc. // All rights reserved. // // http://www.prof-uis.com // http://www.fossware.com // mailto:foss@fossware.com // // This source code can be used, modified and redistributed // under the terms of the license agreement that is included // in the Professional User Interface Suite package. // // Warranties and Disclaimers: // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES, // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA, // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. #include "stdafx.h" #if _MFC_VER < 0x700 #include <../src/AfxImpl.h> #else #include <../src/mfc/AfxImpl.h> #endif #if (!defined __EXT_TOOLCONTROLBAR_H) #include <ExtToolControlBar.h> #endif #if (!defined __EXT_MENUCONTROLBAR_H) #include <ExtMenuControlBar.h> #endif #if (!defined __EXTDOCKBAR_H) #include "ExtDockBar.h" #endif #if( !defined __EXTMINIDOCKFRAMEWND_H) #include "ExtMiniDockFrameWnd.h" #endif #if (!defined __EXT_PAINT_MANAGER_H) #include <ExtPaintManager.h> #endif #if (!defined __EXT_MEMORY_DC_H) #include <../Src/ExtMemoryDC.h> #endif #if (!defined __EXT_POPUP_MENU_WND_H) #include <ExtPopupMenuWnd.h> #endif #if (!defined __ExtCmdManager_H) #include <ExtCmdManager.h> #endif #if (!defined __EXT_LOCALIZATION_H) #include <../Src/ExtLocalization.h> #endif #include <../profuisdll/resource.h> #include <math.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define CX_BORDER 1 #define CY_BORDER 1 ///////////////////////////////////////////////////////////////////////////// // CExtToolControlBar::CExtToolControlBarCmdUI class CExtToolControlBar::CExtToolControlBarCmdUI : public CCmdUI { void _SetCheckImpl( int nCheck, bool bUpdaeteInCmdManager ); public: // re-implementations only virtual void Enable( BOOL bOn ); virtual void SetRadio( BOOL bOn ); virtual void SetCheck( int nCheck ) { _SetCheckImpl(nCheck,true); }; virtual void SetText( LPCTSTR lpszText ) { lpszText; // ignore it }; }; // class CExtToolControlBar::CExtToolControlBarCmdUI void CExtToolControlBar::CExtToolControlBarCmdUI::_SetCheckImpl( int nCheck, bool bUpdaeteInCmdManager ) { ASSERT(nCheck >= 0 && nCheck <= 2); // 0=>off, 1=>on, 2=>indeterminate CExtToolControlBar* pToolBar = (CExtToolControlBar*)m_pOther; ASSERT(pToolBar != NULL); ASSERT_KINDOF(CExtToolControlBar, pToolBar); ASSERT(m_nIndex < m_nIndexMax); if( pToolBar->IsRightExpandButton(m_nIndex) ) return; UINT nNewStyle = pToolBar->GetButtonStyle(m_nIndex) & ~(TBBS_CHECKED | TBBS_INDETERMINATE); if( nCheck == 1 ) nNewStyle |= TBBS_CHECKED; else if( nCheck == 2 ) nNewStyle |= TBBS_INDETERMINATE; ASSERT( !(nNewStyle & TBBS_SEPARATOR) ); pToolBar->SetButtonStyle(m_nIndex, nNewStyle | TBBS_CHECKBOX); if( bUpdaeteInCmdManager ) { CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( pToolBar->GetSafeHwnd() ), pToolBar->GetButtonID(m_nIndex) ); if( pCmdItem != NULL ) { pCmdItem->StateSetCheck( (nNewStyle & (TBBS_CHECKED|TBBS_INDETERMINATE) ) ? true : false ); } } } void CExtToolControlBar::CExtToolControlBarCmdUI::Enable( BOOL bOn ) { CCmdUI::m_bEnableChanged = TRUE; CExtToolControlBar* pToolBar = (CExtToolControlBar*)m_pOther; ASSERT(pToolBar != NULL); ASSERT_KINDOF(CExtToolControlBar, pToolBar); ASSERT(m_nIndex < m_nIndexMax); if( pToolBar->IsRightExpandButton(m_nIndex) ) return; UINT nNewStyle = pToolBar->GetButtonStyle(m_nIndex) & ~TBBS_DISABLED; if( !bOn ) nNewStyle |= TBBS_DISABLED; ASSERT(!(nNewStyle & TBBS_SEPARATOR)); pToolBar->SetButtonStyle(m_nIndex, nNewStyle); CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( pToolBar->GetSafeHwnd() ), pToolBar->GetButtonID(m_nIndex) ); if( pCmdItem != NULL ) pCmdItem->StateEnable( bOn ? true : false ); } void CExtToolControlBar::CExtToolControlBarCmdUI::SetRadio( BOOL bOn ) { _SetCheckImpl( bOn ? 1 : 0, false ); CExtToolControlBar* pToolBar = (CExtToolControlBar*)m_pOther; ASSERT(pToolBar != NULL); ASSERT_KINDOF(CExtToolControlBar, pToolBar); ASSERT(m_nIndex < m_nIndexMax); if( pToolBar->IsRightExpandButton(m_nIndex) ) return; CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( pToolBar->GetSafeHwnd() ), pToolBar->GetButtonID(m_nIndex) ); if( pCmdItem != NULL ) pCmdItem->StateSetRadio( bOn ? true : false ); } ///////////////////////////////////////////////////////////////////////////// // CExtBarButton IMPLEMENT_DYNCREATE(CExtBarButton, CObject) UINT CExtBarButton::GetStyle() const { ASSERT_VALID( this ); return m_nStyle; } void CExtBarButton::SetStyle( UINT nStyle ) { ASSERT_VALID( this ); m_nStyle = nStyle; if( (m_nStyle & TBBS_PRESSED) == 0 ) m_bDropDownHT = FALSE; _UpdateCmdIdFromStyle(); _UpdateCtrl(); #if (!defined __EXT_MFC_NO_CUSTOMIZE) _UpdateCmdNodeFromStyle(); #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) } void CExtBarButton::ModifyStyle( UINT nAdd, UINT nRemove // = 0 ) { ASSERT_VALID( this ); m_nStyle |= nAdd; m_nStyle &= ~nRemove; if( (m_nStyle & TBBS_PRESSED) == 0 ) m_bDropDownHT = FALSE; _UpdateCmdIdFromStyle(); _UpdateCtrl(); #if (!defined __EXT_MFC_NO_CUSTOMIZE) _UpdateCmdNodeFromStyle(); #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) } bool CExtBarButton::IsWrap( CExtBarButton::e_wrap_t _evt ) const { ASSERT_VALID( this ); ASSERT( __EVT_MIN_VALUE <= _evt && _evt <= __EVT_MAX_VALUE ); switch( _evt ) { case __EVT_HORZ: return m_bWrapH; case __EVT_VERT: return m_bWrapV; default: ASSERT( _evt == __EVT_FLOAT ); return m_bWrapF; } // switch( _evt ) } void CExtBarButton::SetWrap( CExtBarButton::e_wrap_t _evt, bool bWrap // = true ) { ASSERT_VALID( this ); ASSERT( __EVT_MIN_VALUE <= _evt && _evt <= __EVT_MAX_VALUE ); switch( _evt ) { case __EVT_HORZ: m_bWrapH = bWrap; break; case __EVT_VERT: m_bWrapV = bWrap; break; default: ASSERT( _evt == __EVT_FLOAT ); m_bWrapF = bWrap; break; } // switch( _evt ) } bool CExtBarButton::IsLargeIcon() const { ASSERT_VALID( this ); if( GetBar() == NULL ) return false; if( IsSeparator() ) return false; return GetBar()->IsLargeIcons(); } bool CExtBarButton::IsDisplayScreenTip() const { ASSERT_VALID( this ); if( GetBar() == NULL ) return false; if( IsSeparator() ) return false; return GetBar()->IsDisplayScreenTips(); } bool CExtBarButton::IsDisplayShortcutKeysOnScreenTip() const { ASSERT_VALID( this ); if( GetBar() == NULL ) return false; if( IsSeparator() ) return false; return GetBar()->IsDisplayShortcutKeysOnScreenTips(); } UINT CExtBarButton::GetCmdID( bool bEffective // = true ) const { ASSERT_VALID( this ); return bEffective ? m_nEffectiveCmdID : m_nButtonCmdID; } void CExtBarButton::SetCmdID( UINT nCmdID, bool bEffectiveOnly, // = false bool bEffectiveRecalcLayout // = false ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); bool bRecalcLayout = false; if( bEffectiveRecalcLayout && m_nEffectiveCmdID != nCmdID ) bRecalcLayout = true; m_nEffectiveCmdID = nCmdID; if( !bEffectiveOnly ) { m_nButtonCmdID = nCmdID; if( m_nButtonCmdID == ID_SEPARATOR ) { m_nStyle |= TBBS_SEPARATOR; m_nStyle &= ~(TBBS_BUTTON); } else { m_nStyle |= TBBS_BUTTON; m_nStyle &= ~(TBBS_SEPARATOR); } } // if( !bEffectiveOnly ) if( bRecalcLayout ) GetBar()->_RecalcLayoutImpl(); } bool CExtBarButton::IsAbleToTrackMenu( bool bCustomizeMode // = false ) { ASSERT_VALID( this ); bCustomizeMode; if( GetMenu() != NULL || IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) #if (!defined __EXT_MFC_NO_CUSTOMIZE) || ( m_pCmdNodeC != NULL && ( (m_pCmdNodeC->GetFlags() & __ECTN_AUTO_POPUP) != 0 || m_pCmdNodeC->GetNodeCount() > 0 ) ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) ) return true; return false; } bool CExtBarButton::IsContainerOfPopupLikeMenu() { ASSERT_VALID( this ); ASSERT( ( m_hMenu == NULL ) || ( m_hMenu != NULL && ::IsMenu(m_hMenu) ) ); return m_bPopupMenu; } CExtSafeString CExtBarButton::GetText() const { ASSERT_VALID( this ); CExtSafeString sText( _T("") ); if( IsSeparator() ) return sText; CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), GetCmdID( false ) ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(); if( pNode != NULL ) { ASSERT_VALID( pNode ); return CExtSafeString( pNode->GetTextInToolbar( pCmdItem ) ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) ASSERT( pCmdItem != NULL ); if( !pCmdItem->m_sToolbarText.IsEmpty() ) sText = pCmdItem->m_sToolbarText; int nTabChrPos = sText.Find( _T('\t') ); if( nTabChrPos < 0 ) return sText; return sText.Left( nTabChrPos ); } bool CExtBarButton::GetSeparatedDropDown() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); return (pNode->GetFlags()&__ECTN_TBB_SEPARATED_DROPDOWN) ? true : false; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_bSeparatedDropDown; } void CExtBarButton::SetSeparatedDropDown( bool bSeparatedDropDown // = true ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->ModifyFlags( bSeparatedDropDown ? __ECTN_TBB_SEPARATED_DROPDOWN : 0, bSeparatedDropDown ? 0 : __ECTN_TBB_SEPARATED_DROPDOWN ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) if( m_bSeparatedDropDown == bSeparatedDropDown ) return; m_bSeparatedDropDown = bSeparatedDropDown; _UpdateCtrl(); } bool CExtBarButton::GetAutoChangeID() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); return (pNode->GetFlags()&__ECTN_TBB_AUTOCHANGE_ID) ? true : false; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_bAutoChangeID; } void CExtBarButton::SetAutoChangeID( bool bAutoChangeID // = true ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->ModifyFlags( bAutoChangeID ? __ECTN_TBB_AUTOCHANGE_ID : 0, bAutoChangeID ? 0 : __ECTN_TBB_AUTOCHANGE_ID ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) if( m_bAutoChangeID == bAutoChangeID ) return; m_bAutoChangeID = bAutoChangeID; _UpdateCtrl(); } bool CExtBarButton::GetNoRotateVerticalLayout() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); return (pNode->GetFlags()&__ECTN_TBB_NO_ROTATE_VL) ? true : false; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_bNoRotateVerticalLayout; } void CExtBarButton::SetNoRotateVerticalLayout( bool bNoRotateVerticalLayout // = true ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->ModifyFlags( bNoRotateVerticalLayout ? __ECTN_TBB_NO_ROTATE_VL : 0, bNoRotateVerticalLayout ? 0 : __ECTN_TBB_NO_ROTATE_VL ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) if( m_bNoRotateVerticalLayout == bNoRotateVerticalLayout ) return; m_bNoRotateVerticalLayout = bNoRotateVerticalLayout; _UpdateCtrl(); } bool CExtBarButton::GetCtrlVisibleVertically() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); return (pNode->GetFlags()&__ECTN_TBB_CTRL_VIS_VL) ? true : false; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_bCtrlVisibleVert; } void CExtBarButton::SetCtrlVisibleVertically( bool bVisible ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->ModifyFlags( bVisible ? __ECTN_TBB_CTRL_VIS_VL : 0, bVisible ? 0 : __ECTN_TBB_CTRL_VIS_VL ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) m_bCtrlVisibleVert = bVisible; _UpdateCtrl(); } BOOL CExtBarButton::PutToPopupMenu( CExtPopupMenuWnd * pPopup ) { ASSERT_VALID( this ); ASSERT( pPopup != NULL ); ASSERT( pPopup->GetSafeHwnd() == NULL ); if( m_pCtrl != NULL ) { if( m_pCtrl->SendMessage( CExtToolControlBar::g_nMsgPutToPopupMenu, reinterpret_cast <WPARAM> ( pPopup ), 0 ) ) return TRUE; } if( IsAbleToTrackMenu() ) { CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), GetCmdID( false ) ); ASSERT( pCmdItem != NULL ); CExtSafeString sText = pCmdItem->m_sMenuText; if( sText.IsEmpty() ) sText = pCmdItem->m_sToolbarText; HICON hIcon = g_CmdManager->CmdGetHICON( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), GetCmdID( false ) ); VERIFY( pPopup->ItemInsert( (UINT)CExtPopupMenuWnd::TYPE_POPUP, -1, sText, hIcon ) ); CExtPopupMenuWnd * pChildPopup = pPopup->ItemGetPopup( pPopup->ItemGetCount() - 1 ); ASSERT( pChildPopup != NULL ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode(); if( pNode != NULL ) { ASSERT_VALID( pNode ); VERIFY( pChildPopup->UpdateFromCmdTree( GetCmdTargetWnd()->GetSafeHwnd(), pNode, false ) ); } // if( pNode != NULL ) else #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) { HMENU hMenu = GetMenu(); ASSERT( hMenu != NULL ); ASSERT( ::IsMenu(hMenu) ); CMenu _menu; _menu.Attach( hMenu ); pChildPopup->UpdateFromMenu( GetCmdTargetWnd()->GetSafeHwnd(), &_menu, IsContainerOfPopupLikeMenu(), false ); _menu.Detach(); } // else from if( pNode != NULL ) } // if( IsAbleToTrackMenu() ) else { if( !pPopup->ItemInsert( GetCmdID(true) ) ) { ASSERT( FALSE ); return FALSE; } } // else from if( IsAbleToTrackMenu() ) return TRUE; } CRect CExtBarButton::RectDropDown() const { ASSERT_VALID( this ); CRect rcBtnDropDownArea = Rect(); BOOL bHorz = TRUE; ASSERT_VALID( GetBar() ); if( (!GetNoRotateVerticalLayout()) && GetBar()->IsDockedVertically() ) bHorz = FALSE; if( bHorz ) { rcBtnDropDownArea.left = rcBtnDropDownArea.right - __DROPDOWN_ARROW_GAP*2 - CExtPaintManager::g_glyph_btn_expand_bottom.Size().cx ; // if( m_bSeparatedDropDown ) // rcBtnDropDownArea.left -= __DROPDOWN_ARROW_GAP; } // if( bHorz ) else { rcBtnDropDownArea.top = rcBtnDropDownArea.bottom - __DROPDOWN_ARROW_GAP*2 - CExtPaintManager::g_glyph_btn_expand_right.Size().cy ; // if( m_bSeparatedDropDown ) // rcBtnDropDownArea.top -= __DROPDOWN_ARROW_GAP; } // else from if( bHorz ) return rcBtnDropDownArea; } CRect CExtBarButton::Rect() const { ASSERT_VALID( this ); CRect rcBtn = m_ActiveRect; if( GetBar() != NULL && g_PaintManager->GetCb2DbTransparentMode( (CObject *)(this) ) && g_PaintManager->IsMenuMustCombineExcludeArea() && GetBar()->m_pDockSite != NULL && (! GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) ) { CSize sizeToolBarRgnRounders = g_PaintManager->GetToolBarRgnRoundersSize(); CRect rcClient; GetBar()->GetClientRect( &rcClient ); CRect rcBtn2(rcBtn); if( GetBar()->IsDockedVertically() ) { rcBtn2.OffsetRect( rcBtn.left - rcClient.left, rcClient.bottom - rcBtn.bottom ); rcBtn2.top = rcBtn.top - sizeToolBarRgnRounders.cy*2-1; rcBtn2.right = rcClient.right; } // if( GetBar()->IsDockedVertically() ) else if( GetBar()->IsDockedHorizontally() ) { rcBtn2.OffsetRect( rcClient.right - rcBtn.right, rcBtn.top - rcClient.top ); rcBtn2.left = rcBtn.left - sizeToolBarRgnRounders.cx*2-1; rcBtn2.bottom = rcClient.bottom; } // else if( GetBar()->IsDockedHorizontally() ) } return rcBtn; } CSize CExtBarButton::CalculateLayout( CDC & dc, CSize sizePreCalc, BOOL bHorz ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT_VALID( (&dc) ); if( GetNoRotateVerticalLayout() ) bHorz = TRUE; if( (m_pCtrl != NULL) && (!m_bVertDocked || GetCtrlVisibleVertically()) ) { ASSERT_VALID( m_pCtrl ); CRect rcCtrl; m_pCtrl->GetWindowRect( &rcCtrl ); m_ActiveSize.cx = rcCtrl.Width(); m_ActiveSize.cy = sizePreCalc.cy; return m_ActiveSize; } // if( (m_pCtrl != NULL) && (!m_bVertDocked || GetCtrlVisibleVertically()) ) m_ActiveSize = sizePreCalc; if( IsSeparator() ) { if( bHorz ) m_ActiveSize.cx = __EXT_TB_BUTTON_SEPARATOR_WIDTH; else m_ActiveSize.cy = __EXT_TB_BUTTON_SEPARATOR_HEIGHT; } // if( IsSeparator() ) else { #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( GetCmdNode() == NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) { CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), GetCmdID( true ) ); if( pCmdItem == NULL ) return m_ActiveSize; // shutdown mode } // if( GetCmdNode() == NULL ) CExtCmdIcon * pIcon = GetIconPtr(); CSize _size( 0, 0 ); if( pIcon != NULL && (! pIcon->IsEmpty() ) ) { _size = pIcon->GetSize(); if( IsLargeIcon() ) { _size.cx *= 2; _size.cy *= 2; } // if( IsLargeIcon() ) _size.cx += __EXT_TB_BUTTON_INNER_MARGIN*2; _size.cy += __EXT_TB_BUTTON_INNER_MARGIN*2; } // if( pIcon != NULL && (! pIcon->IsEmpty() ) ) CExtSafeString sMeasureText = GetText(); if( !sMeasureText.IsEmpty() ) { static TCHAR stat_strDummyAmpSeq[] = _T("\001\001"); sMeasureText.Replace( _T("&&"), stat_strDummyAmpSeq ); sMeasureText.Remove( _T('&') ); sMeasureText.Replace( stat_strDummyAmpSeq, _T("&") ); CRect rcTextMeasure( 0, 0, 0, 0 ); dc.DrawText( sMeasureText, sMeasureText.GetLength(), &rcTextMeasure, DT_SINGLELINE|DT_LEFT|DT_CALCRECT ); if( bHorz ) { _size.cx += rcTextMeasure.Width() + __EXT_TB_BUTTON_TEXT_MARGIN*2; _size.cy = max( _size.cy, rcTextMeasure.Height() ); } // if( bHorz ) else { _size.cx = max( _size.cx, rcTextMeasure.Height() ); _size.cy += rcTextMeasure.Width() //+ __EXT_TB_BUTTON_TEXT_MARGIN*2 + __EXT_TB_BUTTON_TEXT_MARGIN ; } // else from if( bHorz ) _size.cx += __EXT_TB_BUTTON_INNER_MARGIN*2; _size.cy += __EXT_TB_BUTTON_INNER_MARGIN*2; } // if( !sMeasureText.IsEmpty() ) _size.cx += __EXT_TB_BUTTON_OUTER_MARGIN*2; _size.cy += __EXT_TB_BUTTON_OUTER_MARGIN*2; if( m_ActiveSize.cx < _size.cx ) m_ActiveSize.cx = _size.cx; if( m_ActiveSize.cy < _size.cy ) m_ActiveSize.cy = _size.cy; } // else from if( IsSeparator() ) if( IsAbleToTrackMenu() && (!GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar))) ) { if( bHorz ) m_ActiveSize.cx += __DROPDOWN_ARROW_GAP*2 + CExtPaintManager::g_glyph_btn_expand_bottom.Size().cx ; else m_ActiveSize.cy += __DROPDOWN_ARROW_GAP*2 + CExtPaintManager::g_glyph_btn_expand_right.Size().cy ; } return m_ActiveSize; } CExtCmdIcon * CExtBarButton::GetIconPtr() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( GetBar()->GetSafeHwnd() == NULL ) return NULL; __EXT_MFC_SAFE_LPCTSTR strProfile = g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ); if( strProfile == NULL ) return NULL; #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pOwnNode = GetCmdNode(); if( pOwnNode != NULL ) { ASSERT_VALID( pOwnNode ); if( !CExtCmdManager::IsCommand( GetCmdID( true ) ) ) return NULL; CExtCmdIcon * pIcon = pOwnNode->GetIconPtrInToolbar( g_CmdManager->CmdGetPtr( strProfile, GetCmdID( true ) ) ); if( pIcon == NULL ) return NULL; if( (pOwnNode->GetFlags()&__ECTN_TBB_AUTOCHANGE_ID) == 0 ) return pIcon; } // if( pOwnNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return g_CmdManager->CmdGetIconPtr( strProfile, GetCmdID( true ) ); } void CExtBarButton::Paint( CDC & dc, bool bHorz ) { ASSERT_VALID( this ); ASSERT_VALID( (&dc) ); if( GetNoRotateVerticalLayout() ) bHorz = TRUE; if( (m_pCtrl != NULL) && (!m_bVertDocked || GetCtrlVisibleVertically()) ) return; ASSERT( !IsSeparator() ); CRect rcArea( m_ActiveRect ); rcArea.DeflateRect( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); if( rcArea.right <= rcArea.left || rcArea.bottom <= rcArea.top ) return; if( (! IsVisible() ) || (GetStyle() & TBBS_HIDDEN) != 0 || (! dc.RectVisible(&m_ActiveRect) ) ) return; ASSERT( m_ActiveSize.cx >= __EXT_TB_BUTTON_INNER_MARGIN*2 && m_ActiveSize.cy >= __EXT_TB_BUTTON_INNER_MARGIN*2 ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); bool bPushed = ( IsPressed() && (!bDockSiteCustomizeMode) ) ? true : false; bool bEnabled = ( IsDisabled() && (!bDockSiteCustomizeMode) ) ? false : true; bool bHover = ( IsHover() && (!bDockSiteCustomizeMode) ) ? true : false; if( !bDockSiteCustomizeMode ) { if( CExtToolControlBar::g_bMenuTracking || CExtPopupMenuWnd::IsMenuTracking() ) bHover = false; else if( !bHover ) bHover = IsPressedTracking(); //if( bPushed && bHover && IsPressedTracking() ) //bHover = false; } // if( !bDockSiteCustomizeMode ) bool bIndeterminate = ( IsIndeterminate() && (!bDockSiteCustomizeMode) ) ? true : false; CExtSafeString sText = GetText(); CExtCmdIcon * pIcon = GetIconPtr(); CExtCmdIcon _iconLarge; if( pIcon != NULL && (! pIcon->IsEmpty() ) && IsLargeIcon() ) { CSize _sizeIcon = pIcon->GetSize(); _sizeIcon.cx *= 2; _sizeIcon.cy *= 2; if( _iconLarge.CreateScaledCopy( *pIcon, _sizeIcon ) ) pIcon = &_iconLarge; #ifdef _DEBUG else { ASSERT( FALSE ); } #endif // _DEBUG } CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd( this, bHorz, rcArea, sText, pIcon, true, bHover, bPushed, bIndeterminate, bEnabled, true,false,false, CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT, (HFONT)GetBar()->OnGetToolbarFont( !bHorz )->GetSafeHandle(), // NULL // (+ 2.23) ( IsAbleToTrackMenu() && (!GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar))) ) ? true : false, 0, (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) ) ); if( m_bSeparatedDropDown ) { _ppbd.m_bSeparatedDropDown = true; if( (m_bDropDownHT || CExtToolControlBar::g_bMenuTracking) && bPushed && (!bDockSiteCustomizeMode) ) { //_ppbd.m_bPushed = false; _ppbd.m_bPushedDropDown = true; } } g_PaintManager->PaintPushButton( dc, _ppbd ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL && pSite->IsCustomizeMode() && pSite->CustomizedNodeGet() != NULL && pSite->CustomizedNodeGet() == GetCmdNode( false ) ) { g_PaintManager->PaintDragSourceRect( dc, rcArea ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) } void CExtBarButton::OnUpdateCmdUI( CWnd * pTarget, BOOL bDisableIfNoHndler, int nIndex ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT_VALID( pTarget ); if( IsSeparator() // ignore separators || ( IsAbleToTrackMenu() // ignore menu drop buttons && (GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar))) ) ) return; #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL ) { CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode != NULL && (pNode->GetFlags() & __ECTN_AUTO_POPUP) != 0 ) return; if( pSite->IsUserBarCommand( GetCmdID( false ) ) ) return; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) // send the update notification CExtToolControlBar::CExtToolControlBarCmdUI state; state.m_pOther = GetBar(); state.m_nIndex = nIndex; state.m_nIndexMax = GetBar()->GetButtonsCount(); state.m_nID = GetCmdID( false ); state.DoUpdate( pTarget, bDisableIfNoHndler ); } bool CExtBarButton::CanStartCommandDrag() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( IsSeparator() ) return false; if( m_pCtrl->GetSafeHwnd() != NULL ) return false; #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( GetCmdNode() == NULL ) return false; #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return true; } #if (!defined __EXT_MFC_NO_CUSTOMIZE) void CExtBarButton::_UpdateCmdNodeFromStyle() { ASSERT_VALID( this ); if( GetBar() == NULL ) return; ASSERT_VALID( GetBar() ); CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode == NULL ) return; ASSERT_VALID( pNode ); if( GetStyle() & TBBS_HIDDEN ) pNode->ModifyFlags( __ECTN_TBB_HIDDEN, 0 ); else pNode->ModifyFlags( 0, __ECTN_TBB_HIDDEN ); } bool CExtBarButton::IsCustomizeActiveItem() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite == NULL ) return false; return pSite->IsActiveItem( this ); } void CExtBarButton::SetCustomizeActiveItem() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( IsSeparator() ) return; CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite == NULL ) return; pSite->ActiveItemSet( this, GetBar()->GetSafeHwnd() ); GetBar()->_GetIndexOf( this ); RedrawButton(); } int CExtBarButton::CalculateDropOverEffect( CPoint point, CExtCustomizeSite::CCmdDragInfo & _dragInfo, bool bAllowTrackNodePopup // = true ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( !_dragInfo.IsEmpty() ); _dragInfo; if( IsSeparator() ) return 0; if( !CanStartCommandDrag() ) return 0; if( GetCmdNode() == NULL ) return false; //CPoint ptMid = Rect().CenterPoint(); CPoint ptMidL = Rect().TopLeft(); ptMidL.x += Rect().Size().cx / 4; ptMidL.y += Rect().Size().cy / 4; CPoint ptMidR( ptMidL ); ptMidR.x += Rect().Size().cx / 2; ptMidR.y += Rect().Size().cy / 2; int nRetVal = 0; if( (GetBar()->m_dwStyle & CBRS_ORIENT_HORZ) != 0 ) { if( point.x <= ptMidL.x ) nRetVal = -1; else if( point.x >= ptMidR.x ) nRetVal = 1; else nRetVal = -2; } // if( (GetBar()->m_dwStyle & CBRS_ORIENT_HORZ) != 0 ) else { if( point.y <= ptMidL.y ) nRetVal = -1; else if( point.y >= ptMidR.y ) nRetVal = 1; else nRetVal = -2; } // else from if( (GetBar()->m_dwStyle & CBRS_ORIENT_HORZ) != 0 ) if( bAllowTrackNodePopup ) { CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); ASSERT( pSite != NULL ); if( IsAbleToTrackMenu( true ) ) { CExtCustomizeCmdTreeNode * pOwnNode = GetCmdNode(); ASSERT_VALID( pOwnNode ); CRect rcBtn = Rect(); GetBar()->ClientToScreen( &rcBtn ); GetBar()->ClientToScreen( &point ); DWORD dwTrackFlags = OnGetTrackPopupFlags(); pSite->DropTargetPopupTrack( pOwnNode, rcBtn, point, dwTrackFlags ); } // if( IsAbleToTrackMenu() ) else pSite->DropTargetPopupCancel(); } // if( bAllowTrackNodePopup ) else { CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL ) pSite->DropTargetPopupCancel(); } // else from if( bAllowTrackNodePopup ) return nRetVal; } CExtCustomizeCmdTreeNode * CExtBarButton::GetCmdNode( bool bInitial // = false ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( IsSeparator() ) { ASSERT( m_pCmdNodeI == NULL ); ASSERT( m_pCmdNodeC == NULL ); return NULL; } CExtCustomizeCmdTreeNode * pNode = bInitial ? m_pCmdNodeI : m_pCmdNodeC; #ifdef _DEBUG if( pNode != NULL ) { ASSERT_VALID( pNode ); } #endif // _DEBUG return pNode; } void CExtBarButton::OnCustomizeUpdateProps( CExtCustomizeCmdTreeNode * pNode // = NULL // update from basic node ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( pNode == NULL ) pNode = m_pCmdNodeI; ASSERT_VALID( pNode ); #ifdef _DEBUG if( m_pCmdNodeI != NULL ) { ASSERT_VALID( m_pCmdNodeI ); } #endif // _DEBUG ASSERT( !IsSeparator() ); SetCmdID( pNode->GetCmdID(false), false ); // reset all IDs SetCmdID( pNode->GetCmdID(true), true ); // reset effective ID DWORD dwNodeFlags = pNode->GetFlags(); if( dwNodeFlags&__ECTN_TBB_APPEND_MDI_MENU ) SetAppendMdiWindowsMenu( true ); if( dwNodeFlags&__ECTN_TBB_SEPARATED_DROPDOWN ) SetSeparatedDropDown( true ); if( dwNodeFlags&__ECTN_TBB_AUTOCHANGE_ID ) SetAutoChangeID( true ); if( dwNodeFlags&__ECTN_TBB_NO_ROTATE_VL ) SetNoRotateVerticalLayout( true ); } void CExtBarButton::SetBasicCmdNode( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); ASSERT( !IsSeparator() ); m_pCmdNodeI = pNode; ASSERT( m_pCmdNodeI->GetCmdID(false) == GetCmdID(false) ); } void CExtBarButton::SetCustomizedCmdNode( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); #ifdef _DEBUG if( m_pCmdNodeI != NULL ) { ASSERT_VALID( m_pCmdNodeI ); } #endif // _DEBUG ASSERT( !IsSeparator() ); m_pCmdNodeC = pNode; ASSERT( m_pCmdNodeC->GetCmdID(false) == GetCmdID(false) ); } CExtCustomizeCmdTreeNode * CExtBarButton::OnCustomizeNodeInit( CExtCustomizeSite * pSite, CExtCustomizeCmdTreeNode * pParentNode // toolbar node ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( pSite != NULL ); ASSERT_VALID( pParentNode ); if( IsSeparator() ) { ASSERT( m_pCmdNodeI == NULL ); ASSERT( m_pCmdNodeC == NULL ); return NULL; } m_pCmdNodeI = m_pCmdNodeC = NULL; m_pCmdNodeI = new CExtCustomizeCmdTreeNode( GetCmdID( false ), GetCmdID( true ) ); pParentNode->InsertNode( pSite, m_pCmdNodeI ); INT nOwnIdx = GetBar()->_GetIndexOf( this ); ASSERT( 0 <= nOwnIdx && nOwnIdx < GetBar()->GetButtonsCount() ); if( nOwnIdx > 0 ) { CExtBarButton * pPrevTBB = GetBar()->GetButton( nOwnIdx - 1 ); if( pPrevTBB->IsSeparator() ) m_pCmdNodeI->ModifyFlags( __ECTN_GROUP_START ); } // __ECTN_GROUP_START CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetBar()->m_hWnd ), GetCmdID() ); ASSERT( pCmdItem != NULL ); m_pCmdNodeI->SetTextInToolbar( pCmdItem->m_sToolbarText ); m_pCmdNodeI->SetTextInMenu( pCmdItem->m_sMenuText ); DWORD dwAddFlags = 0; if( IsAppendMdiWindowsMenu() ) dwAddFlags |= __ECTN_TBB_APPEND_MDI_MENU; if( GetSeparatedDropDown() || pCmdItem->StateIsSeparatedDD() ) dwAddFlags |= __ECTN_TBB_SEPARATED_DROPDOWN; if( GetAutoChangeID() || pCmdItem->StateIsAutochangeID() ) dwAddFlags |= __ECTN_TBB_AUTOCHANGE_ID; if( GetNoRotateVerticalLayout() || pCmdItem->StateIsNoRotateVL() ) dwAddFlags |= __ECTN_TBB_NO_ROTATE_VL; if( GetCtrlVisibleVertically() || pCmdItem->StateIsCtrlVisibleVertically() ) dwAddFlags |= __ECTN_TBB_CTRL_VIS_VL; if( dwAddFlags != 0 ) m_pCmdNodeI->ModifyFlags( dwAddFlags ); m_pCmdNodeI->SetLParam( pCmdItem->m_nLParamUserData ); #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) m_pCmdNodeI->TextFieldWidthSet( pCmdItem->m_nTextFieldWidth ); m_pCmdNodeI->DropDownWidthSet( pCmdItem->m_nDropDownWidth ); m_pCmdNodeI->DropDownHeightMaxSet( pCmdItem->m_nDropDownHeightMax ); if( pCmdItem->StateIsCombo() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_COMBO|__ECTN_TBB_TEXT_FIELD, 0 ); else if( pCmdItem->StateIsTextField() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_TEXT_FIELD, __ECTN_TBB_COMBO ); else m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_TEXT_FIELD|__ECTN_TBB_COMBO|__ECTN_TBB_RESIZABLE ); if( pCmdItem->StateIsTextFieldNotEditable() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_TF_NE, 0 ); else m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_TF_NE ); if( ( (m_pCmdNodeI->GetFlags() & (__ECTN_TBB_COMBO|__ECTN_TBB_TEXT_FIELD)) != 0 ) && pCmdItem->StateIsResizable() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_RESIZABLE, 0 ); #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) if( pCmdItem->StateIsColor() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_COLOR, 0 ); else m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_COLOR ); if( pCmdItem->StateIsColorBtnDefault() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_MCB_DEFAULT, 0 ); else m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_MCB_DEFAULT ); if( pCmdItem->StateIsColorBtnCustom() ) m_pCmdNodeI->ModifyFlags( __ECTN_TBB_MCB_CUSTOM, 0 ); else m_pCmdNodeI->ModifyFlags( 0, __ECTN_TBB_MCB_CUSTOM ); if( GetMenu() != NULL ) { CMenu * pMenu = CMenu::FromHandle( GetMenu() ); ASSERT( pMenu != NULL ); VERIFY( m_pCmdNodeI->LoadMenuTree( GetBar(), GetBar()->GetCustomizeSite(), pMenu, IsContainerOfPopupLikeMenu() ) ); SetMenu( NULL, true, true ); // no longer needed } // if( GetMenu() != NULL ) return m_pCmdNodeI; } #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) int CExtBarButton::GetInitialResizingStateH( // -1 - left side resizing, 1 - right side resizing, 0 - no resizing at specified point (in bar's client coord) CPoint point, int * p_nWidthMin, // = NULL int * p_nWidthMax // = NULL ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); point; p_nWidthMin; p_nWidthMax; return 0; } #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) void CExtBarButton::RedrawButton( bool bUpdateNow // = false ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( IsVisible() && (GetStyle() & TBBS_HIDDEN) == 0 ) GetBar()->_InvalidateButton( GetBar()->_GetIndexOf(this) ); if( bUpdateNow ) GetBar()->UpdateWindow(); } void CExtBarButton::SetMenu( HMENU hMenu, bool bPopupMenu, bool bAutoDestroyMenu ) { ASSERT_VALID( this ); _DestroyMenu(); m_hMenu = hMenu; if( m_hMenu != NULL ) { ASSERT( ::IsMenu(hMenu) ); VERIFY( g_CmdManager->UpdateFromMenu( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), hMenu ) ); m_bPopupMenu = bPopupMenu ? true : false; ModifyStyle(0,TBBS_DISABLED); m_bAutoDestroyMenu = bAutoDestroyMenu; } } UINT CExtBarButton::OnGetTrackPopupFlags() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( GetBar()->m_bPresubclassDialogMode ) { if( GetBar()->IsDockedAtRight() ) return TPMX_RIGHTALIGN; if( GetBar()->IsDockedAtLeft() ) return TPMX_LEFTALIGN; if( GetBar()->IsDockedAtBottom() ) return TPMX_BOTTOMALIGN; return TPMX_TOPALIGN; } switch( GetBar()->GetSafeDockBarDlgCtrlID() ) { case AFX_IDW_DOCKBAR_TOP: return TPMX_TOPALIGN; case AFX_IDW_DOCKBAR_BOTTOM: return TPMX_BOTTOMALIGN; case AFX_IDW_DOCKBAR_LEFT: return TPMX_LEFTALIGN; case AFX_IDW_DOCKBAR_RIGHT: return TPMX_RIGHTALIGN; default: // floating return TPMX_TOPALIGN; } // switch( GetBar()->GetSafeDockBarDlgCtrlID() ) } bool CExtBarButton::OnSetCursor( CPoint point ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); point; #if (!defined __EXT_MFC_NO_CUSTOMIZE) #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite == NULL ) return false; if( pSite->ActiveItemGet() != ((LPVOID)this) ) return false; CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode == NULL ) return false; ASSERT_VALID( pNode ); if( (pNode->GetFlags() & __ECTN_TBB_RESIZABLE) == 0 ) return false; int nInitialResizingStateH = GetInitialResizingStateH( point ); if( nInitialResizingStateH != 0 ) { #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) CExtLocalResourceHelper _LRH; CWinApp * pApp = ::AfxGetApp(); ASSERT_VALID( pApp ); HCURSOR hCursor = pApp->LoadCursor( MAKEINTRESOURCE( IDC_EXT_RESIZE_H1 ) ); if( hCursor == NULL ) { ASSERT( FALSE ); hCursor = ::LoadCursor( NULL, IDC_SIZEWE ); } // if( hCursor == NULL ) #else // if - (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) HCURSOR hCursor = ::LoadCursor( NULL, IDC_SIZEWE ); #endif // if NOT - (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) ASSERT( hCursor != NULL ); ::SetCursor( hCursor ); return true; } // if( nInitialResizingStateH != 0 ) #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return false; } CWnd * CExtBarButton::GetCmdTargetWnd() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); //CWnd * pWnd = GetBar()->_GetDockingFrameImpl(); // if( pWnd == NULL ) // pWnd = GetBar()->GetOwner(); CWnd * pWnd = GetBar()->GetOwner(); ASSERT_VALID( pWnd ); return pWnd; } UINT CExtBarButton::OnTrackPopup( CPoint point, bool bSelectAny ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return UINT(-1L); if( !IsEnabled() ) return UINT(-1L); CWnd * pWnd = CtrlGet(); if( pWnd != NULL ) { LRESULT lResult = pWnd->SendMessage( CExtToolControlBar::g_nMsgContinueTrackMenu, WPARAM( this ), bSelectAny ? 1L : 0L ); lResult; return UINT(-1L); } // if( pWnd != NULL ) if( !IsAbleToTrackMenu() ) return UINT(-1L); bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking; if( CExtToolControlBar::g_bMenuTracking //&& CExtPopupMenuWnd::IsMenuTracking() && GetBar()->_GetIndexOf(this) == GetBar()->m_nBtnIdxMenuTracking ) return UINT(-1L); CExtToolControlBar::_CloseTrackingMenus(); if( GetBar()->IsFloating() ) { GetBar()->ActivateTopParent(); CFrameWnd * pFrame = GetBar()->GetDockingFrame(); ASSERT_VALID( pFrame ); pFrame->BringWindowToTop(); } CWnd * pWndCmdTarget = GetCmdTargetWnd(); ASSERT_VALID( pWndCmdTarget ); CExtPopupMenuWnd * pPopup = new CExtPopupMenuWnd; #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode(); if( pNode != NULL ) { ASSERT_VALID( pNode ); VERIFY( pPopup->UpdateFromCmdTree( pWndCmdTarget->GetSafeHwnd(), pNode ) ); } // if( pNode != NULL ) else #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) { HMENU hMenu = GetMenu(); ASSERT( hMenu != NULL ); ASSERT( ::IsMenu(hMenu) ); CMenu _menu; _menu.Attach( hMenu ); VERIFY( pPopup->UpdateFromMenu( pWndCmdTarget->GetSafeHwnd(), &_menu, IsContainerOfPopupLikeMenu() ) ); _menu.Detach(); } // else from if( pNode != NULL ) if( IsAppendMdiWindowsMenu() && (! GetBar()->_IsDockSiteCustomizeMode() ) ) pPopup->UpdateMdiWindowsMenu( pWndCmdTarget ); CExtToolControlBar::g_bMenuTracking = bPrevTBMT; CRect rcBtn = Rect(); GetBar()->ClientToScreen( &rcBtn ); GetBar()->ClientToScreen( &point ); DWORD dwTrackFlags = OnGetTrackPopupFlags() | TPMX_COMBINE_DEFAULT | TPMX_OWNERDRAW_FIXED ; if( bSelectAny ) dwTrackFlags |= TPMX_SELECT_ANY; if( CExtToolControlBar::g_bMenuTrackingExpanded ) dwTrackFlags |= TPMX_NO_HIDE_RARELY; GetBar()->_SwitchMenuTrackingIndex( GetBar()->_GetIndexOf( this ) ); if( GetAutoChangeID() && (! CExtControlBar::FindHelpMode(GetBar()) ) ) { HWND hWndBar = GetBar()->GetSafeHwnd(); CExtToolControlBar::g_bMenuTracking = true; UINT nResultCmdID = 0; if( !pPopup->TrackPopupMenu( dwTrackFlags|TPMX_NO_WM_COMMAND|TPMX_DO_MESSAGE_LOOP, point.x,point.y, &rcBtn, GetBar(), CExtToolControlBar::_CbPaintCombinedContent, &nResultCmdID, true ) ) { delete pPopup; CExtToolControlBar::_CloseTrackingMenus(); return UINT(-1L); } if( nResultCmdID == 0 ) return UINT(-1L); if( hWndBar != NULL && ::IsWindow(hWndBar) ) { SetCmdID( nResultCmdID, true, true ); OnDeliverCmd(); } } // if( GetAutoChangeID() ) else { if( !pPopup->TrackPopupMenu( dwTrackFlags, point.x,point.y, &rcBtn, GetBar(), CExtToolControlBar::_CbPaintCombinedContent, NULL, true ) ) { delete pPopup; CExtToolControlBar::_CloseTrackingMenus(); return UINT(-1L); } CExtToolControlBar::g_bMenuTracking = true; GetBar()->_SwitchMenuTrackingIndex( GetBar()->_GetIndexOf( this ) ); } // else from if( GetAutoChangeID() ) return UINT(-1L); } void CExtBarButton::OnHover( CPoint point, bool bOn ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return; if( bOn ) { /// if( CExtToolControlBar::g_bMenuTracking /// && CExtPopupMenuWnd::IsMenuTracking() /// && GetBar()->m_nBtnIdxHover != GetBar()->m_nBtnIdxMenuTracking /// ) /// CExtPopupMenuWnd::CancelMenuTracking(); if( CExtToolControlBar::g_bMenuTracking ) OnTrackPopup( point, false ); else { CExtControlBar::stat_SetMessageString( GetCmdTargetWnd(), (UINT)( ( ( ! GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) && ( ! IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) && CExtCmdManager::IsCommand( GetCmdID(false) ) ) ? GetCmdID(true) : AFX_IDS_IDLEMESSAGE ) ); } CWnd * pCtrl = CtrlGet(); if( pCtrl == NULL || (pCtrl->GetStyle() & WS_VISIBLE) == 0 ) ((CExtMouseCaptureSink *)GetBar())->SetCapture( GetBar()->GetSafeHwnd() ); } // if( bOn ) else { CExtControlBar::stat_SetMessageString( GetCmdTargetWnd() ); CExtMouseCaptureSink::ReleaseCapture(); } // else from if( bOn ) } void CExtBarButton::OnClick( CPoint point, bool bDown ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return; bool bDropDownHT = false; if( m_bSeparatedDropDown ) { CRect rcBtnDropDownArea = RectDropDown(); if( rcBtnDropDownArea.PtInRect(point) ) bDropDownHT = true; } if( bDown ) { CExtToolControlBar::_CloseTrackingMenus(); bool bAllowTrackMenu = true; m_bDropDownHT = false; if( m_bSeparatedDropDown ) { m_bDropDownHT = bDropDownHT; if(!bDropDownHT ) bAllowTrackMenu = false; } if( bAllowTrackMenu && IsAbleToTrackMenu() ) { CExtToolControlBar::g_bMenuTrackingExpanded = false; OnTrackPopup( point, false ); return; } CExtControlBar::stat_SetMessageString( GetCmdTargetWnd(), (WPARAM)GetCmdID(false) ); return; } // if( bDown ) CExtControlBar::stat_SetMessageString( GetCmdTargetWnd() ); if( !m_bDropDownHT ) bDropDownHT = false; m_bDropDownHT = false; if( (IsAbleToTrackMenu() && (!GetSeparatedDropDown())) || bDropDownHT ) return; CWnd * pCtrl = CtrlGet(); if( pCtrl != NULL && (pCtrl->GetStyle() & WS_VISIBLE) ) { ASSERT_VALID( pCtrl ); CExtToolControlBar * pBar = GetSafeBar(); ASSERT_VALID( pBar ); if( CWnd::GetCapture() == pBar ) pBar->SendMessage( WM_CANCELMODE ); //pCtrl->SetFocus(); return; } OnDeliverCmd(); } void CExtBarButton::OnDeliverCmd() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); if( !CExtCmdManager::IsCommand( GetCmdID(false) ) ) return; CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), GetCmdID(true) ); ASSERT( pCmdItem != NULL ); if( pCmdItem == NULL ) return; VERIFY( pCmdItem->Deliver( GetBar(), true ) ); } int CExtBarButton::OnToolHitTest( CPoint point, TOOLINFO * pTI ) { ASSERT_VALID( this ); point; // should be inside this button if( !IsDisplayScreenTip() ) return -1; int nCmdID = (int)GetCmdID(true); CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetSafeBar()->GetSafeHwnd() ), nCmdID ); if( pCmdItem == NULL || pCmdItem->m_sTipTool.IsEmpty() ) return -1; if( pTI != NULL ) { CRect rcArea = Rect(); ::CopyRect( &(pTI->rect), &rcArea ); CExtSafeString strTip = pCmdItem->m_sTipTool; if( IsDisplayShortcutKeysOnScreenTip() && (! pCmdItem->m_sAccelText.IsEmpty() ) ) { if( !strTip.IsEmpty() ) strTip += _T(" "); strTip += _T("("); strTip += pCmdItem->m_sAccelText; strTip += _T(")"); } pTI->uId = (UINT)nCmdID; pTI->hwnd = GetSafeBar()->GetSafeHwnd(); pTI->lpszText = (LPTSTR) ::calloc( (strTip.GetLength() + 1), sizeof(TCHAR) ); if( pTI->lpszText != NULL ) _tcscpy( pTI->lpszText, strTip ); else pTI->lpszText = LPSTR_TEXTCALLBACK; } // if( pTI != NULL ) return nCmdID; } LRESULT CExtBarButton::OnHelpHitTest( CPoint point ) { ASSERT_VALID( this ); point; // should be inside this button if( IsSeparator() ) return -1; if( IsAbleToTrackMenu() ) { //CExtToolControlBar::_CloseTrackingMenus(); //GetBar()->TrackButtonMenu( GetBar()->_GetIndexOf(this), FALSE, TRUE ); //return -2; if( GetBar()->m_pDockSite == NULL || (! GetBar()->m_pDockSite->m_bHelpMode ) ) return -3L; OnTrackPopup( point, false ); return CExtToolControlBar::_ContinueHelpHitTestMode( GetBar() ); } // if( IsAbleToTrackMenu() ) int nCmdID = (int)GetCmdID(false); CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetSafeBar()->GetSafeHwnd() ), nCmdID ); if( pCmdItem == NULL //|| pCmdItem->m_sTipTool.IsEmpty() ) return -1; return nCmdID; } ///////////////////////////////////////////////////////////////////////////// // CExtBarColorButton IMPLEMENT_DYNCREATE(CExtBarColorButton, CExtBarButton) void CExtBarColorButton::OnSyncIcon() { ASSERT_VALID( this ); HICON hIcon = NULL; OnGenerateColorIcon( &hIcon ); ASSERT( hIcon != NULL ); if( hIcon == NULL ) return; VERIFY( g_CmdManager->CmdSetIcon( g_CmdManager->ProfileNameFromWnd( GetSafeBar()->GetSafeHwnd() ), GetCmdID(true), hIcon, false ) ); } void CExtBarColorButton::OnGenerateColorIcon( HICON * p_hIcon ) { ASSERT_VALID( this ); ASSERT( p_hIcon != NULL ); ASSERT( (*p_hIcon) == NULL ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode(false); if( pNode != NULL && GetBar()->GetSafeHwnd() != NULL && ::IsWindow( GetBar()->GetSafeHwnd() ) ) { ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL ) { (*p_hIcon) = pSite->OnColorItemGenerateIcon( this, pNode, ColorGet(true) ); if( (*p_hIcon) != NULL ) return; } // if( pSite != NULL ) } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) switch( m_eDIT ) { case __DIT_FRAME: { (*p_hIcon) = CExtPaintManager::stat_GenerateColorIconFrame( ColorGet(true) ); ASSERT( (*p_hIcon) != NULL ); } break; case __DIT_CHAR: { LOGFONT lf; ::memset( &lf, 0 , sizeof(LOGFONT) ); g_PaintManager->m_FontBold.GetLogFont( &lf ); _tcscpy( lf.lfFaceName, _T("Times New Roman") ); lf.lfHeight = ::MulDiv( lf.lfHeight, 3, 2 ); lf.lfWeight = 900; CFont fontForLetter; VERIFY( fontForLetter.CreateFontIndirect( &lf ) ); ASSERT( fontForLetter.GetSafeHandle() != NULL ); (*p_hIcon) = CExtPaintManager::stat_GenerateColorIconChar( ColorGet(true), (HFONT)fontForLetter.GetSafeHandle() ); ASSERT( (*p_hIcon) != NULL ); } break; //case __DIT_BOX: default: { (*p_hIcon) = CExtPaintManager::stat_GenerateColorIconBox( ColorGet(true) ); ASSERT( (*p_hIcon) != NULL ); } break; } // switch( m_eDIT ) } __EXT_MFC_SAFE_LPCTSTR CExtBarColorButton::BtnTextDefaultGet() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL && GetBar()->GetSafeHwnd() != NULL && ::IsWindow( GetBar()->GetSafeHwnd() ) ) { ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = ((CExtToolControlBar *)GetBar())->GetCustomizeSite(); if( pSite != NULL ) pSite->OnColorItemGetBtnTextDefault( (CExtBarColorButton*)this, pNode, (CExtSafeString &)m_sBtnTextColorDefault ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_sBtnTextColorDefault.IsEmpty() ? _T("") : m_sBtnTextColorDefault ; } void CExtBarColorButton::BtnTextDefaultSet( __EXT_MFC_SAFE_LPCTSTR sText // = NULL ) { ASSERT_VALID( this ); m_sBtnTextColorDefault = (sText == NULL) ? _T("") : sText ; } __EXT_MFC_SAFE_LPCTSTR CExtBarColorButton::BtnTextCustomGet() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL && GetBar()->GetSafeHwnd() != NULL && ::IsWindow( GetBar()->GetSafeHwnd() ) ) { ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = ((CExtToolControlBar *)GetBar())->GetCustomizeSite(); if( pSite != NULL ) pSite->OnColorItemGetBtnTextCustom( (CExtBarColorButton*)this, pNode, (CExtSafeString &)m_sBtnTextColorCustom ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_sBtnTextColorCustom.IsEmpty() ? _T("") : m_sBtnTextColorCustom ; } void CExtBarColorButton::BtnTextCustomSet( __EXT_MFC_SAFE_LPCTSTR sText // = NULL ) { ASSERT_VALID( this ); m_sBtnTextColorCustom = (sText == NULL) ? _T("") : sText ; } CExtCmdIcon * CExtBarColorButton::GetIconPtr() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); return CExtBarButton::GetIconPtr(); } BOOL CExtBarColorButton::PutToPopupMenu( CExtPopupMenuWnd * pPopup ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( CtrlGet() == NULL ); ASSERT( IsAbleToTrackMenu() ); if( !IsEnabled() ) { if( !pPopup->ItemInsert( GetCmdID(true) ) ) { ASSERT( FALSE ); return FALSE; } return TRUE; } CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetSafeBar()->GetSafeHwnd() ), GetCmdID(false) ); CExtCmdIcon * pIcon = GetIconPtr(); CExtPopupColorMenuWnd * pColorPopup = new CExtPopupColorMenuWnd; VERIFY( pPopup->ItemInsertSpecPopup( pColorPopup, -1, pCmdItem->m_sMenuText, (pIcon == NULL || pIcon->IsEmpty()) ? NULL : pIcon->GetIcon() ) ); pColorPopup->m_lParamCookie = LParamCookieGet(); pColorPopup->m_bEnableBtnColorDefault = IsEnabledBtnColorDefault(); pColorPopup->m_bEnableBtnColorCustom = IsEnabledBtnColorCustom(); pColorPopup->m_clrDefault = ColorGet( false ); pColorPopup->m_clrInitial = ColorGet( true ); CExtSafeString _s( BtnTextDefaultGet() ); if( !_s.IsEmpty() ) pColorPopup->m_sBtnTextColorDefault = _s; _s = BtnTextCustomGet(); if( !_s.IsEmpty() ) pColorPopup->m_sBtnTextColorCustom = _s; #if (!defined __EXT_MFC_NO_CUSTOMIZE) pColorPopup->_CmdNodeSet( GetCmdNode(false) ); #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return TRUE; } bool CExtBarColorButton::IsAbleToTrackMenu( bool bCustomizeMode // = false ) { ASSERT_VALID( this ); if( bCustomizeMode ) return false; return true; } UINT CExtBarColorButton::OnTrackPopup( CPoint point, bool bSelectAny ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( CtrlGet() == NULL ); ASSERT( IsAbleToTrackMenu() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return UINT(-1L); if( !IsEnabled() ) return UINT(-1L); bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking; if( CExtToolControlBar::g_bMenuTracking //&& CExtPopupMenuWnd::IsMenuTracking() && GetBar()->_GetIndexOf(this) == GetBar()->GetMenuTrackingButton() ) return UINT(-1L); CExtToolControlBar::_CloseTrackingMenus(); if( GetBar()->IsFloating() ) { GetBar()->ActivateTopParent(); CFrameWnd * pFrame = GetBar()->GetDockingFrame(); ASSERT_VALID( pFrame ); pFrame->BringWindowToTop(); } CWnd * pWndCmdTarget = GetCmdTargetWnd(); ASSERT_VALID( pWndCmdTarget ); CExtPopupColorMenuWnd * pPopup = new CExtPopupColorMenuWnd; VERIFY( pPopup->CreatePopupMenu( GetCmdTargetWnd()->GetSafeHwnd() ) ); pPopup->m_lParamCookie = LParamCookieGet(); pPopup->m_bEnableBtnColorDefault = IsEnabledBtnColorDefault(); pPopup->m_bEnableBtnColorCustom = IsEnabledBtnColorCustom(); pPopup->m_clrDefault = ColorGet( false ); pPopup->m_clrInitial = ColorGet( true ); CExtSafeString _s( BtnTextDefaultGet() ); if( !_s.IsEmpty() ) pPopup->m_sBtnTextColorDefault = _s; _s = BtnTextCustomGet(); if( !_s.IsEmpty() ) pPopup->m_sBtnTextColorCustom = _s; #if (!defined __EXT_MFC_NO_CUSTOMIZE) pPopup->_CmdNodeSet( GetCmdNode(false) ); #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) CExtToolControlBar::g_bMenuTracking = bPrevTBMT; CRect rcBtn = Rect(); GetBar()->ClientToScreen( &rcBtn ); GetBar()->ClientToScreen( &point ); DWORD dwTrackFlags = OnGetTrackPopupFlags() | TPMX_COMBINE_DEFAULT | TPMX_OWNERDRAW_FIXED ; //if( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) if( bSelectAny ) dwTrackFlags |= TPMX_SELECT_ANY; if( CExtToolControlBar::g_bMenuTrackingExpanded ) dwTrackFlags |= TPMX_NO_HIDE_RARELY; GetBar()->_SwitchMenuTrackingIndex( GetBar()->_GetIndexOf( this ) ); UINT nResultCmdID = (UINT)-1L; if( !pPopup->TrackPopupMenu( dwTrackFlags, point.x,point.y, &rcBtn, GetBar(), CExtToolControlBar::_CbPaintCombinedContent, &nResultCmdID, true ) ) { delete pPopup; CExtToolControlBar::_CloseTrackingMenus(); return UINT(-1L); } CExtToolControlBar::g_bMenuTracking = true; GetBar()->_SwitchMenuTrackingIndex( GetBar()->_GetIndexOf( this ) ); return UINT(-1L); } int CExtBarColorButton::OnToolHitTest( CPoint point, TOOLINFO * pTI ) { ASSERT_VALID( this ); return CExtBarButton::OnToolHitTest( point, pTI ); } LRESULT CExtBarColorButton::OnHelpHitTest( CPoint point ) { ASSERT_VALID( this ); // return // CExtBarButton::OnHelpHitTest( point ); point; return GetCmdID(); } void CExtBarColorButton::OnUpdateCmdUI( CWnd * pTarget, BOOL bDisableIfNoHndler, int nIndex ) { ASSERT_VALID( this ); CExtBarButton::OnUpdateCmdUI( pTarget, bDisableIfNoHndler, nIndex ); } bool CExtBarColorButton::CanStartCommandDrag() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( GetCmdNode() == NULL ) return false; #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return true; } LPARAM CExtBarColorButton::LParamCookieGet() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL ) { ASSERT_VALID( pNode ); return pNode->GetLParam(); } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_lParamCookie; } void CExtBarColorButton::LParamCookieSet( LPARAM lParamCookie // = 0L ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->SetLParam( lParamCookie ); } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) m_lParamCookie = lParamCookie; } bool CExtBarColorButton::IsEnabledBtnColorDefault() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL ) { ASSERT_VALID( pNode ); return ( (pNode->GetFlags() & __ECTN_TBB_MCB_DEFAULT) != 0 ) ? true : false; } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_bEnableBtnColorDefault; } void CExtBarColorButton::EnableBtnColorDefault( bool bEnable // = true ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode(false); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->ModifyFlags( bEnable ? __ECTN_TBB_MCB_DEFAULT : 0, bEnable ? 0 : __ECTN_TBB_MCB_DEFAULT ); } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) m_bEnableBtnColorDefault = bEnable; } bool CExtBarColorButton::IsEnabledBtnColorCustom() const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL ) { ASSERT_VALID( pNode ); return ( (pNode->GetFlags() & __ECTN_TBB_MCB_CUSTOM) != 0 ) ? true : false; } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return m_bEnableBtnColorCustom; } void CExtBarColorButton::EnableBtnColorCustom( bool bEnable // = true ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode(false); if( pNode != NULL ) { ASSERT_VALID( pNode ); pNode->ModifyFlags( bEnable ? __ECTN_TBB_MCB_CUSTOM: 0, bEnable ? 0 : __ECTN_TBB_MCB_CUSTOM ); } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) m_bEnableBtnColorCustom = bEnable; } COLORREF CExtBarColorButton::ColorGet( bool bSelected ) const { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = ((CExtBarButton*)this)->GetCmdNode(false); if( pNode != NULL && GetBar()->GetSafeHwnd() != NULL && ::IsWindow( GetBar()->GetSafeHwnd() ) ) { ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = ((CExtToolControlBar *)GetBar())->GetCustomizeSite(); if( pSite != NULL ) { COLORREF clr = bSelected ? m_clrDefault : m_clrSelected; if( pSite->OnColorItemValueGet( (CExtBarColorButton*)this, pNode, clr, bSelected ) ) return clr; } // if( pSite != NULL ) } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) return bSelected ? m_clrDefault : m_clrSelected; } void CExtBarColorButton::ColorSet( COLORREF clr, bool bSelected ) { ASSERT_VALID( this ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode(false); if( pNode != NULL && GetBar()->GetSafeHwnd() != NULL && ::IsWindow( GetBar()->GetSafeHwnd() ) ) { ASSERT_VALID( GetBar() ); ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL ) pSite->OnColorItemValueSet( this, pNode, clr, bSelected ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) if( bSelected ) { if( m_clrSelected != clr ) { m_clrSelected = clr; OnSyncIcon(); } } else { if( m_clrDefault != clr ) { m_clrDefault = clr; OnSyncIcon(); } } } #if (!defined __EXT_MFC_NO_CUSTOMIZE) int CExtBarColorButton::CalculateDropOverEffect( CPoint point, CExtCustomizeSite::CCmdDragInfo & _dragInfo, bool bAllowTrackNodePopup // = true ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( !_dragInfo.IsEmpty() ); bAllowTrackNodePopup; return CExtBarButton::CalculateDropOverEffect( point, _dragInfo, false ); } CExtCustomizeCmdTreeNode * CExtBarColorButton::GetCmdNode( bool bInitial // = false ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); return CExtBarButton::GetCmdNode( bInitial ); } void CExtBarColorButton::SetBasicCmdNode( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); CExtBarButton::SetBasicCmdNode( pNode ); } void CExtBarColorButton::SetCustomizedCmdNode( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); CExtBarButton::SetCustomizedCmdNode( pNode ); } CExtCustomizeCmdTreeNode * CExtBarColorButton::OnCustomizeNodeInit( CExtCustomizeSite * pSite, CExtCustomizeCmdTreeNode * pParentNode // toolbar node ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); CExtCustomizeCmdTreeNode * pNode = CExtBarButton::OnCustomizeNodeInit( pSite, pParentNode ); ASSERT_VALID( pNode ); return pNode; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) void CExtBarColorButton::OnDeliverCmd() { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * pNode = GetCmdNode( false ); if( pNode != NULL ) { ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL && pSite->OnColorItemChanged( this, pNode, true, ColorGet(true), LParamCookieGet() ) ) return; } // if( pNode != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) GetCmdTargetWnd()->SendMessage( CExtPopupColorMenuWnd::g_nMsgNotifyColorChangedFinally, (WPARAM)ColorGet(true), LParamCookieGet() ); } ///////////////////////////////////////////////////////////////////////////// // CExtBarContentExpandButton IMPLEMENT_DYNCREATE(CExtBarContentExpandButton, CExtBarButton) CSize CExtBarContentExpandButton::CalculateLayout( CDC & dc, CSize sizePreCalc, BOOL bHorz ) { dc; ASSERT( m_pCtrl == NULL ); ASSERT( !IsSeparator() ); ASSERT( GetCmdID(false) == __ID_TOOLBAR_RIGHT_BUTTON__ ); CSize _size( bHorz ? __RIGHT_BUTTON_HORZ_DX__ : sizePreCalc.cx, bHorz ? sizePreCalc.cy : __RIGHT_BUTTON_VERT_DY__ ); m_ActiveSize = _size; m_ActiveSize.cx += __EXT_TB_BUTTON_INNER_MARGIN*2; m_ActiveSize.cy += __EXT_TB_BUTTON_INNER_MARGIN*2; return m_ActiveSize; } void CExtBarContentExpandButton::Paint( CDC & dc, bool bHorz ) { ASSERT( m_pCtrl == NULL ); ASSERT_VALID( (&dc) ); ASSERT( !IsSeparator() ); ASSERT( GetCmdID(false) == __ID_TOOLBAR_RIGHT_BUTTON__ ); // ASSERT( !IsDisabled() ); CRect rcArea( m_ActiveRect ); rcArea.DeflateRect( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); if( rcArea.right <= rcArea.left || rcArea.bottom <= rcArea.top ) return; ASSERT( m_ActiveSize.cx >= __EXT_TB_BUTTON_INNER_MARGIN*2 && m_ActiveSize.cy >= __EXT_TB_BUTTON_INNER_MARGIN*2 ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); bool bEnabled = ( (!IsDisabled()) || bDockSiteCustomizeMode ) ? true : false; bool bBarIsCompletelyVisible = (GetButtons().GetSize() == 0) ? true : false; bool bEmpty = ( (!GetBar()->m_bRightButtonDisplayBarsList) && bBarIsCompletelyVisible ) ? true : false; bool bPushed = ( (!bEmpty) && bEnabled && IsPressed() && (!bDockSiteCustomizeMode) ) ? true : false; bool bHover = ( (!bEmpty) && bEnabled && (!bDockSiteCustomizeMode) && IsHover() && !CExtToolControlBar::g_bMenuTracking && !CExtPopupMenuWnd::IsMenuTracking() ) ? true : false; g_PaintManager->PaintToolbarExpandButton( dc, rcArea, bHorz, bBarIsCompletelyVisible, bEnabled && !bEmpty, bPushed, bHover, this, 0L, ( (!bHover) && (!bPushed) ) ); } BOOL CExtBarContentExpandButton::PutToPopupMenu( CExtPopupMenuWnd * pPopup ) { pPopup; ASSERT( FALSE ); return FALSE; } UINT CExtBarContentExpandButton::OnTrackPopup( CPoint point, bool bSelectAny ) { ASSERT_VALID( GetBar() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return UINT(-1L); if( !IsEnabled() ) return UINT(-1L); bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking; if( CExtToolControlBar::g_bMenuTracking //&& CExtPopupMenuWnd::IsMenuTracking() && GetBar()->_GetIndexOf(this) == GetBar()->m_nBtnIdxMenuTracking ) return UINT(-1L); bool bBarIsCompletelyVisible = (GetButtons().GetSize() == 0) ? true : false; bool bEmpty = ( !GetBar()->m_bRightButtonDisplayBarsList && bBarIsCompletelyVisible ) ? true : false; if( bEmpty ) return UINT(-1L); CExtToolControlBar::_CloseTrackingMenus(); CExtToolControlBar::g_bMenuTracking = bPrevTBMT; if( GetBar()->IsFloating() ) { GetBar()->ActivateTopParent(); CFrameWnd * pFrame = GetBar()->GetParentFrame(); if( pFrame != NULL ) pFrame->BringWindowToTop(); } HWND hWndTrack = GetCmdTargetWnd()->GetSafeHwnd(); ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) ); CExtPopupMenuWnd * pPopup = new CExtPopupMenuWnd; VERIFY( pPopup->CreatePopupMenu(hWndTrack) ); CExtControlBar::POPUP_MENU_EVENT_DATA _pmed( CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CTXEXPBTN_TOP, pPopup, GetBar(), CPoint( -1, -1 ), WM_NCLBUTTONDOWN, this ); if( !_pmed.NotifyTarget( false ) ) { // append hidden buttons int nCount = GetButtons().GetSize(); if( nCount != 0 ) { ASSERT( nCount > 0 ); int nCountBefore = pPopup->ItemGetCount(); for( int i=0; i< nCount; i++ ) { CExtBarButton * pTBB = GetButtons() [i]; ASSERT( pTBB != NULL ); if( i==0 && pTBB->IsSeparator() ) continue; ASSERT( !pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ); VERIFY( pTBB->PutToPopupMenu(pPopup) ); } // for( int i=0; i< nCount; i++ ) int nCountAfter = pPopup->ItemGetCount(); ASSERT( nCountAfter >= nCountBefore ); if( nCountAfter != nCountBefore && (!GetBar()->m_bPresubclassDialogMode) && GetBar()->m_bRightButtonDisplayBarsList ) { // append separator VERIFY( pPopup->ItemInsert( CExtPopupMenuWnd::TYPE_SEPARATOR ) ); } } // if( nCount != 0 ) // append show/hide popup if( (!GetBar()->m_bPresubclassDialogMode) && GetBar()->m_bRightButtonDisplayBarsList ) { CFrameWnd * pFrame = GetBar()->_GetDockingFrameImpl(); if( pFrame != NULL ) { ASSERT_VALID( pFrame ); #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) CExtLocalResourceHelper _LRH; #endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) CExtSafeString sShowHidePanels; if( !sShowHidePanels.LoadString(IDS_SHOW_HIDE_PANELS) ) { #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) ASSERT( FALSE ); #endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) sShowHidePanels = _T("&Show/hide panels"); } CExtControlBar::POPUP_MENU_EVENT_DATA _pmed( CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CTXEXPBTN_APPEND, pPopup, GetBar(), CPoint( -1, -1 ), WM_NCLBUTTONDOWN, this ); if( !_pmed.NotifyTarget( false ) ) { VERIFY( pPopup->ItemInsert( (UINT)CExtPopupMenuWnd::TYPE_POPUP, -1, sShowHidePanels ) ); CExtPopupMenuWnd::MENUITEMDATA & mi = pPopup->ItemGetInfo( pPopup->ItemGetCount() - 1 ); mi.SetChildCombine(); mi.SetToolButton(); CExtPopupMenuWnd * pPopupBars = mi.GetPopup(); ASSERT( pPopupBars != NULL ); if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu( pFrame, pPopupBars, CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CTXEXPBTN_BARS, GetBar(), WM_NCLBUTTONDOWN, this ) ) { VERIFY( pPopup->ItemRemove( pPopup->ItemGetCount() - 1 ) ); } } // if( !_pmed.NotifyTarget( false ) ) _pmed.NotifyTarget( true ); } // if( pFrame != NULL ) } // if( (!GetBar()->m_bPresubclassDialogMode) ... #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( GetBar()->m_bCustomizationAllowed && GetBar()->GetCustomizeSite() != NULL ) { // if customization allowed VERIFY( CExtDockBar::_AppendAddRemoveButtonsCustomizeMenu( pPopup, GetBar() ) ); } // if customization allowed #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) } // if( !_pmed.NotifyTarget( false ) ) _pmed.NotifyTarget( true ); if( pPopup->ItemGetCount() == 0 ) { delete pPopup; return UINT(-1L); } CRect rcBtn = Rect(); GetBar()->ClientToScreen( &rcBtn ); GetBar()->ClientToScreen( &point ); DWORD dwTrackFlags = OnGetTrackPopupFlags() | TPMX_COMBINE_DEFAULT | TPMX_OWNERDRAW_FIXED ; //if( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) if( bSelectAny ) dwTrackFlags |= TPMX_SELECT_ANY; if( CExtToolControlBar::g_bMenuTrackingExpanded ) dwTrackFlags |= TPMX_NO_HIDE_RARELY; GetBar()->_SwitchMenuTrackingIndex( GetBar()->_GetIndexOf( this ) ); if( !pPopup->TrackPopupMenu( dwTrackFlags, point.x,point.y, &rcBtn, GetBar(), CExtToolControlBar::_CbPaintCombinedContent, NULL, true ) ) { delete pPopup; CExtToolControlBar::_CloseTrackingMenus(); return UINT(-1L); } #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL ) pSite->BarDefCmdTargetSet( GetBar() ); #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) CExtToolControlBar::g_bMenuTracking = true; GetBar()->_SwitchMenuTrackingIndex( GetBar()->_GetIndexOf( this ) ); return UINT(-1L); } void CExtBarContentExpandButton::OnHover( CPoint point, bool bOn ) { ASSERT_VALID( GetBar() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return; CExtBarButton::OnHover( point, bOn ); } void CExtBarContentExpandButton::OnClick( CPoint point, bool bDown ) { ASSERT_VALID( GetBar() ); bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return; if( !bDown ) return; CExtToolControlBar::g_bMenuTrackingExpanded = false; OnTrackPopup( point, false ); } int CExtBarContentExpandButton::OnToolHitTest( CPoint point, TOOLINFO * pTI ) { ASSERT_VALID( this ); point; // should be inside this button if( pTI != NULL ) { CRect rcArea = Rect(); ::CopyRect( &(pTI->rect), &rcArea ); int nCmdID = AFX_IDS_IDLEMESSAGE; //(int)GetBar()->GetDlgCtrlID(); pTI->uId = (UINT)nCmdID; pTI->hwnd = GetSafeBar()->GetSafeHwnd(); #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) CExtLocalResourceHelper _LRH; #endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) CExtSafeString sExpandTip; if( !sExpandTip.LoadString(IDS_CONTENT_EXPAND_TIP) ) { #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) ASSERT( FALSE ); #endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) sExpandTip = _T("Where are buttons?"); } pTI->lpszText = (LPTSTR) ::calloc( (sExpandTip.GetLength() + 1), sizeof(TCHAR) ); if( pTI->lpszText != NULL ) _tcscpy( pTI->lpszText, sExpandTip ); else pTI->lpszText = LPSTR_TEXTCALLBACK; return nCmdID; } // if( pTI != NULL ) return -1; } LRESULT CExtBarContentExpandButton::OnHelpHitTest( CPoint point ) { ASSERT_VALID( this ); return CExtBarButton::OnHelpHitTest( point ); } bool CExtBarContentExpandButton::CanStartCommandDrag() { ASSERT_VALID( this ); return false; } #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeCmdTreeNode * CExtBarContentExpandButton::GetCmdNode( bool bInitial // = false ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); bInitial; ASSERT( m_pCmdNodeI == NULL ); ASSERT( m_pCmdNodeC == NULL ); return NULL; } void CExtBarContentExpandButton::SetBasicCmdNode( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( m_pCmdNodeI == NULL ); ASSERT( m_pCmdNodeC == NULL ); ASSERT( FALSE ); // should be never called pNode; } void CExtBarContentExpandButton::SetCustomizedCmdNode( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( m_pCmdNodeI == NULL ); ASSERT( m_pCmdNodeC == NULL ); ASSERT( FALSE ); // should be never called pNode; } CExtCustomizeCmdTreeNode * CExtBarContentExpandButton::OnCustomizeNodeInit( CExtCustomizeSite * pSite, CExtCustomizeCmdTreeNode * pParentNode // toolbar node ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT( pSite != NULL ); ASSERT_VALID( pParentNode ); pSite; pParentNode; return NULL; // no customization support } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) ///////////////////////////////////////////////////////////////////////////// // CExtBarSliderButton IMPLEMENT_DYNCREATE(CExtBarSliderButton, CExtBarButton) ULONG CExtBarSliderButton::ScrollLimitGet() const { ASSERT_VALID( this ); ULONG nScrollPageSize = ScrollPageSizeGet(); ULONG nScrollTotalRange = ScrollTotalRangeGet(); ULONG nScrollLimit = nScrollTotalRange; if( nScrollLimit > nScrollPageSize ) nScrollLimit -= nScrollPageSize; else nScrollLimit = 0L; return nScrollLimit; } ULONG CExtBarSliderButton::ScrollTotalRangeGet() const { ASSERT_VALID( this ); return m_nScrollTotalRange; } ULONG CExtBarSliderButton::ScrollTotalRangeSet( ULONG nScrollTotalRange ) { ASSERT_VALID( this ); ULONG nScrollPosOld = ScrollPosGet(); if( nScrollPosOld > nScrollTotalRange ) ScrollPosSet( nScrollTotalRange ); ULONG nScrollTotalRangeOld = ScrollTotalRangeGet(); m_nScrollTotalRange = nScrollTotalRange; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollTotalRangeOld; } ULONG CExtBarSliderButton::ScrollPosGet() const { ASSERT_VALID( this ); return m_nScrollPos; } ULONG CExtBarSliderButton::ScrollPosSet( ULONG nScrollPos ) { ASSERT_VALID( this ); ULONG nScrollPosOld = ScrollPosGet(); m_nScrollPos = nScrollPos; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollPosOld; } ULONG CExtBarSliderButton::ScrollPageSizeGet() const { ASSERT_VALID( this ); return m_nScrollPageSize; } ULONG CExtBarSliderButton::ScrollPageSizeSet( ULONG nScrollPageSize ) { ASSERT_VALID( this ); ULONG nScrollPageSizeOld = ScrollPageSizeGet(); m_nScrollPageSize = nScrollPageSize; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollPageSizeOld; } INT CExtBarSliderButton::ScrollButtonExtentHorzGet() const { ASSERT_VALID( this ); return m_nScrollButtonExtentH; } INT CExtBarSliderButton::ScrollButtonExtentHorzSet( INT nScrollButtonExtent ) { ASSERT_VALID( this ); INT nScrollButtonExtentOld = ScrollButtonExtentHorzGet(); m_nScrollButtonExtentH = nScrollButtonExtent; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollButtonExtentOld; } INT CExtBarSliderButton::ScrollButtonExtentVertGet() const { ASSERT_VALID( this ); return m_nScrollButtonExtentV; } INT CExtBarSliderButton::ScrollButtonExtentVertSet( INT nScrollButtonExtent ) { ASSERT_VALID( this ); INT nScrollButtonExtentOld = ScrollButtonExtentVertGet(); m_nScrollButtonExtentV = nScrollButtonExtent; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollButtonExtentOld; } INT CExtBarSliderButton::ScrollControlExtentHorzGet() const { ASSERT_VALID( this ); return m_nScrollControlExtentH; } INT CExtBarSliderButton::ScrollControlExtentHorzSet( INT nScrollControlExtent ) { ASSERT_VALID( this ); INT nScrollControlExtentOld = ScrollControlExtentHorzGet(); m_nScrollControlExtentH = nScrollControlExtent; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollControlExtentOld; } INT CExtBarSliderButton::ScrollControlExtentVertGet() const { ASSERT_VALID( this ); return m_nScrollControlExtentV; } INT CExtBarSliderButton::ScrollControlExtentVertSet( INT nScrollControlExtent ) { ASSERT_VALID( this ); INT nScrollControlExtentOld = ScrollControlExtentVertGet(); m_nScrollControlExtentV = nScrollControlExtent; ASSERT_VALID( this ); RecalcSliderLayout(); return nScrollControlExtentOld; } #ifdef _DEBUG void CExtBarSliderButton::AssertValid() const { CExtBarButton::AssertValid(); ASSERT( m_nScrollPos <= m_nScrollTotalRange ); ASSERT( m_nScrollButtonExtentH >= 0 ); ASSERT( m_nScrollButtonExtentV >= 0 ); ASSERT( m_nScrollControlExtentH >= 0 ); ASSERT( m_nScrollControlExtentV >= 0 ); ASSERT( m_pCtrl == NULL ); } void CExtBarSliderButton::Dump(CDumpContext& dc) const { CExtBarButton::Dump( dc ); } #endif void CExtBarSliderButton::SetMenu( HMENU hMenu, bool bPopupMenu, bool bAutoDestroyMenu ) { ASSERT_VALID( this ); ASSERT( FALSE ); // should not be used with text-field button hMenu; bPopupMenu; bAutoDestroyMenu; } HMENU CExtBarSliderButton::GetMenu() { ASSERT_VALID( this ); return NULL; } //bool CExtBarSliderButton::IsLargeIcon() const //{ // ASSERT_VALID( this ); // return false; //} // //bool CExtBarSliderButton::IsDisplayScreenTip() const //{ // ASSERT_VALID( this ); // return false; //} // //bool CExtBarSliderButton::IsDisplayShortcutKeysOnScreenTip() const //{ // ASSERT_VALID( this ); // return false; //} void CExtBarSliderButton::SetRect( const RECT & rectButton ) { ASSERT_VALID( this ); m_ActiveRect = rectButton; RecalcSliderLayout(); } bool CExtBarSliderButton::IsAbleToTrackMenu( bool bCustomizeMode // = false ) { ASSERT_VALID( this ); bCustomizeMode; return false; } bool CExtBarSliderButton::IsContainerOfPopupLikeMenu() { ASSERT_VALID( this ); return false; } //CExtCmdIcon * CExtBarSliderButton::GetIconPtr() //{ // ASSERT_VALID( this ); // return NULL; // no icon at all for text-fields //} CSize CExtBarSliderButton::CalculateLayout( CDC & dc, CSize sizePreCalc, BOOL bHorz ) { ASSERT_VALID( this ); ASSERT_VALID( GetBar() ); ASSERT_VALID( (&dc) ); if( GetNoRotateVerticalLayout() ) bHorz = TRUE; m_ActiveSize = sizePreCalc; ASSERT( ! IsSeparator() ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( GetCmdNode() == NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) { CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( GetBar()->GetSafeHwnd() ), GetCmdID( true ) ); if( pCmdItem == NULL ) return m_ActiveSize; // shutdown mode } // if( GetCmdNode() == NULL ) CSize _size( 0, 0 ); // update size for icon bool bIconEmpty = true; CExtCmdIcon * pIcon = GetIconPtr(); if( pIcon != NULL && (! pIcon->IsEmpty() ) ) { bIconEmpty = false; _size = pIcon->GetSize(); if( IsLargeIcon() ) { _size.cx *= 2; _size.cy *= 2; } // if( IsLargeIcon() ) _size.cx += __EXT_TB_BUTTON_INNER_MARGIN*2; _size.cy += __EXT_TB_BUTTON_INNER_MARGIN*2; } // if( pIcon != NULL && (! pIcon->IsEmpty() ) ) // update size for text bool bTextEmpty = true; CExtSafeString sMeasureText = GetText(); if( sMeasureText.IsEmpty() ) { CSize sizeAlign = m_pBar->_GetDefButtonSize(); if( bHorz ) { sizeAlign.cy -= 7; _size.cy = max( _size.cy, sizeAlign.cy ); } // if( bHorz ) else { sizeAlign.cx -= 7; _size.cx = max( _size.cx, sizeAlign.cx ); } // else from if( bHorz ) } // if( sMeasureText.IsEmpty() ) else { bTextEmpty = false; static TCHAR stat_strDummyAmpSeq[] = _T("\001\001"); sMeasureText.Replace( _T("&&"), stat_strDummyAmpSeq ); sMeasureText.Remove( _T('&') ); sMeasureText.Replace( stat_strDummyAmpSeq, _T("&") ); CRect rcTextMeasure( 0, 0, 0, 0 ); dc.DrawText( sMeasureText, sMeasureText.GetLength(), &rcTextMeasure, DT_SINGLELINE|DT_LEFT|DT_CALCRECT ); if( bHorz ) { _size.cx += rcTextMeasure.Width() + __EXT_TB_BUTTON_TEXT_MARGIN*2; _size.cy = max( _size.cy, rcTextMeasure.Height() ); } // if( bHorz ) else { _size.cx = max( _size.cx, rcTextMeasure.Height() ); _size.cy += rcTextMeasure.Width() //+ __EXT_TB_BUTTON_TEXT_MARGIN*2 + __EXT_TB_BUTTON_TEXT_MARGIN ; } // else from if( bHorz ) _size.cx += __EXT_TB_BUTTON_INNER_MARGIN*2; _size.cy += __EXT_TB_BUTTON_INNER_MARGIN*2; } // else from if( sMeasureText.IsEmpty() ) // update size for slider control if( bHorz ) { INT nExtentCtrl = ScrollControlExtentHorzGet(); ASSERT( nExtentCtrl >= 0 ); _size.cx += nExtentCtrl; if( bTextEmpty && bIconEmpty ) _size.cy += __EXT_TB_BUTTON_OUTER_MARGIN*2-2; } // if( bHorz ) else { INT nExtentCtrl = ScrollControlExtentVertGet(); ASSERT( nExtentCtrl >= 0 ); _size.cy += nExtentCtrl; if( bTextEmpty && bIconEmpty ) _size.cx += __EXT_TB_BUTTON_OUTER_MARGIN*2-2; } // else from if( bHorz ) if( !( bTextEmpty && bIconEmpty ) ) { _size.cx += __EXT_TB_BUTTON_OUTER_MARGIN*2; _size.cy += __EXT_TB_BUTTON_OUTER_MARGIN*2; if( m_ActiveSize.cx < _size.cx ) m_ActiveSize.cx = _size.cx; if( m_ActiveSize.cy < _size.cy ) m_ActiveSize.cy = _size.cy; } // if( !( bTextEmpty && bIconEmpty ) ) m_ActiveSize = _size; return m_ActiveSize; } void CExtBarSliderButton::RecalcSliderLayout() { ASSERT_VALID( this ); CRect rcAll = Rect(); rcAll.DeflateRect( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); bool bHorz = GetBar()->IsDockedVertically() ? false : true; if( GetNoRotateVerticalLayout() ) bHorz = true; INT nExtentCtrl = bHorz ? ScrollControlExtentHorzGet() : ScrollControlExtentVertGet(); m_arrAreaRects[__ESA_ICON_AND_TEXT] = rcAll; m_arrAreaRects[__ESA_SLIDER] = rcAll; m_arrAreaRects[__ESA_ICON_AND_TEXT].DeflateRect( 0, 0, bHorz ? nExtentCtrl : 0, bHorz ? 0 : nExtentCtrl ); m_arrAreaRects[__ESA_SLIDER].DeflateRect( bHorz ? m_arrAreaRects[__ESA_ICON_AND_TEXT].Width() : 0, bHorz ? 0 : m_arrAreaRects[__ESA_ICON_AND_TEXT].Height(), 0, 0 ); INT nExtentBtn = bHorz ? ScrollButtonExtentHorzGet() : ScrollButtonExtentVertGet(); m_arrAreaRects[__ESA_SCROLLABLE] = m_arrAreaRects[__ESA_SLIDER]; m_arrAreaRects[__ESA_LINE_UP] = m_arrAreaRects[__ESA_SLIDER]; m_arrAreaRects[__ESA_LINE_DOWN] = m_arrAreaRects[__ESA_SLIDER]; m_arrAreaRects[__ESA_THUMB].SetRect( 0, 0, 0, 0 ); m_arrAreaRects[__ESA_PAGE_UP].SetRect( 0, 0, 0, 0 ); m_arrAreaRects[__ESA_PAGE_DOWN].SetRect( 0, 0, 0, 0 ); ULONG nScrollPos = ScrollPosGet(); ULONG nScrollPageSize = ScrollPageSizeGet(); ULONG nScrollTotalRange = ScrollTotalRangeGet(); ULONG nScrollLimit = ScrollLimitGet(); ULONG nExtentMD = 0L; INT nExtentThumb = 0; if( nScrollLimit > 0L ) { if( nScrollPageSize == 0 ) { nExtentThumb = nExtentBtn; if( nExtentThumb == 0 ) nExtentThumb = 6; } // if( nScrollPageSize == 0 ) else { if( nScrollTotalRange > nScrollPageSize ) { nExtentMD = nScrollTotalRange/nScrollPageSize; } // if( nScrollTotalRange > nScrollPageSize ) } // else from if( nScrollPageSize == 0 ) } // if( nScrollLimit > 0L ) if( bHorz ) { m_arrAreaRects[__ESA_SCROLLABLE].DeflateRect( nExtentBtn, 0 ); m_arrAreaRects[__ESA_LINE_UP].right = m_arrAreaRects[__ESA_LINE_UP].left + nExtentBtn; m_arrAreaRects[__ESA_LINE_DOWN].left = m_arrAreaRects[__ESA_LINE_DOWN].right - nExtentBtn; if( m_arrAreaRects[__ESA_SCROLLABLE].Width() > 5 ) { if( nExtentThumb == 0 && nExtentMD != 0L ) nExtentThumb = ::MulDiv( m_arrAreaRects[__ESA_SCROLLABLE].Width(), nScrollPageSize, nScrollTotalRange ); if( nExtentThumb != 0 && nExtentThumb < 4 ) nExtentThumb = 4; if( nExtentThumb != 0 ) { m_arrAreaRects[__ESA_THUMB] = m_arrAreaRects[__ESA_SCROLLABLE]; m_arrAreaRects[__ESA_THUMB].right = m_arrAreaRects[__ESA_THUMB].left + nExtentThumb; if( nScrollLimit > 0 ) { INT nRestSpace = m_arrAreaRects[__ESA_SCROLLABLE].Width() - m_arrAreaRects[__ESA_THUMB].Width(); ASSERT( nRestSpace > 0 ); INT nOffset = ::MulDiv( nRestSpace, nScrollPos, nScrollLimit ); m_arrAreaRects[__ESA_THUMB].OffsetRect( nOffset, 0 ); if( nScrollPos > 0 ) { m_arrAreaRects[__ESA_PAGE_UP] = m_arrAreaRects[__ESA_SCROLLABLE]; m_arrAreaRects[__ESA_PAGE_UP].right = m_arrAreaRects[__ESA_THUMB].left; } if( nScrollPos < nScrollLimit ) { m_arrAreaRects[__ESA_PAGE_DOWN] = m_arrAreaRects[__ESA_SCROLLABLE]; m_arrAreaRects[__ESA_PAGE_DOWN].left = m_arrAreaRects[__ESA_THUMB].right; } } // if( nScrollLimit > 0 ) } // if( nExtentThumb != 0 ) } // if( m_arrAreaRects[__ESA_SCROLLABLE].Width() > 5 ) } // if( bHorz ) else { m_arrAreaRects[__ESA_SCROLLABLE].DeflateRect( 0, nExtentBtn ); m_arrAreaRects[__ESA_LINE_UP].bottom = m_arrAreaRects[__ESA_LINE_UP].top + nExtentBtn; m_arrAreaRects[__ESA_LINE_DOWN].top = m_arrAreaRects[__ESA_LINE_DOWN].bottom - nExtentBtn; if( m_arrAreaRects[__ESA_SCROLLABLE].Height() > 5 ) { if( nExtentThumb == 0 && nExtentMD != 0L ) nExtentThumb = ::MulDiv( m_arrAreaRects[__ESA_SCROLLABLE].Height(), nScrollPageSize, nScrollTotalRange ); if( nExtentThumb != 0 && nExtentThumb < 4 ) nExtentThumb = 4; if( nExtentThumb != 0 ) { m_arrAreaRects[__ESA_THUMB] = m_arrAreaRects[__ESA_SCROLLABLE]; m_arrAreaRects[__ESA_THUMB].bottom = m_arrAreaRects[__ESA_THUMB].top + nExtentThumb; if( nScrollLimit > 0 ) { INT nRestSpace = m_arrAreaRects[__ESA_SCROLLABLE].Height() - m_arrAreaRects[__ESA_THUMB].Height(); ASSERT( nRestSpace > 0 ); INT nOffset = ::MulDiv( nRestSpace, nScrollPos, nScrollLimit ); m_arrAreaRects[__ESA_THUMB].OffsetRect( 0, nOffset ); if( nScrollPos > 0 ) { m_arrAreaRects[__ESA_PAGE_UP] = m_arrAreaRects[__ESA_SCROLLABLE]; m_arrAreaRects[__ESA_PAGE_UP].bottom = m_arrAreaRects[__ESA_THUMB].top; } if( nScrollPos < nScrollLimit ) { m_arrAreaRects[__ESA_PAGE_DOWN] = m_arrAreaRects[__ESA_SCROLLABLE]; m_arrAreaRects[__ESA_PAGE_DOWN].top = m_arrAreaRects[__ESA_THUMB].bottom; } } // if( nScrollLimit > 0 ) } // if( nExtentThumb != 0 ) } // if( m_arrAreaRects[__ESA_SCROLLABLE].Height() > 5 ) } // else from if( bHorz ) } void CExtBarSliderButton::Paint( CDC & dc, bool bHorz ) { ASSERT_VALID( this ); ASSERT_VALID( (&dc) ); if( GetNoRotateVerticalLayout() ) bHorz = TRUE; ASSERT( ! IsSeparator() ); if( (! IsVisible() ) || (GetStyle() & TBBS_HIDDEN) != 0 || (! dc.RectVisible(&m_ActiveRect) ) ) return; CRect rcArea( m_ActiveRect ); rcArea.DeflateRect( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); INT nExtentCtrl = bHorz ? ScrollControlExtentHorzGet() : ScrollControlExtentVertGet(); rcArea.DeflateRect( 0, 0, bHorz ? nExtentCtrl : 0, bHorz ? 0 : nExtentCtrl ); if( rcArea.right > rcArea.left && rcArea.bottom > rcArea.top && dc.RectVisible( &rcArea ) ) { // if icon/text area is not empty and visible bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); bool bPushed = false; // ( IsPressed() && (!bDockSiteCustomizeMode) ) // ? true : false; bool bEnabled = ( IsDisabled() && (!bDockSiteCustomizeMode) ) ? false : true; bool bHover = false; // ( IsHover() && (!bDockSiteCustomizeMode) ) // ? true : false; //if( !bDockSiteCustomizeMode ) //{ // if( CExtToolControlBar::g_bMenuTracking // || CExtPopupMenuWnd::IsMenuTracking() // ) // bHover = false; // else if( !bHover ) // bHover = IsPressedTracking(); //} // if( !bDockSiteCustomizeMode ) bool bIndeterminate = false; // ( IsIndeterminate() && (!bDockSiteCustomizeMode) ) // ? true : false; CExtSafeString sText = GetText(); CExtCmdIcon * pIcon = GetIconPtr(); CExtCmdIcon _iconLarge; if( pIcon != NULL && (! pIcon->IsEmpty() ) && IsLargeIcon() ) { CSize _sizeIcon = pIcon->GetSize(); _sizeIcon.cx *= 2; _sizeIcon.cy *= 2; if( _iconLarge.CreateScaledCopy( *pIcon, _sizeIcon ) ) pIcon = &_iconLarge; #ifdef _DEBUG else { ASSERT( FALSE ); } #endif // _DEBUG } CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd( this, bHorz, rcArea, sText, pIcon, true, bHover, bPushed, bIndeterminate, bEnabled, true,false,false, CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT, (HFONT)GetBar()->OnGetToolbarFont( !bHorz )->GetSafeHandle(), // NULL // (+ 2.23) ( IsAbleToTrackMenu() && (!GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar))) ) ? true : false, 0, (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) ) ); //if( m_bSeparatedDropDown ) //{ // _ppbd.m_bSeparatedDropDown = true; // if( (m_bDropDownHT || CExtToolControlBar::g_bMenuTracking) // && bPushed // && (!bDockSiteCustomizeMode) // ) // { // //_ppbd.m_bPushed = false; // _ppbd.m_bPushedDropDown = true; // } //} g_PaintManager->PaintPushButton( dc, _ppbd ); } // if icon/text area is not empty and visible if( m_arrAreaRects[__ESA_SLIDER].right > m_arrAreaRects[__ESA_SLIDER].left && m_arrAreaRects[__ESA_SLIDER].bottom > m_arrAreaRects[__ESA_SLIDER].top && dc.RectVisible( &m_arrAreaRects[__ESA_SLIDER] ) ) { // if slider area is not empty and visible for( int nRectNo = __ESA_PAINT_RANGE_FIRST; nRectNo <= __ESA_PAINT_RANGE_LAST; nRectNo++ ) { // walk and paint all areas if( m_arrAreaRects[nRectNo].right <= m_arrAreaRects[nRectNo].left || m_arrAreaRects[nRectNo].bottom <= m_arrAreaRects[nRectNo].top || ( ! dc.RectVisible( &m_arrAreaRects[nRectNo] ) ) ) continue; OnPaintScrollArea( dc, (CExtBarSliderButton::e_SliderArea_t)nRectNo, bHorz ); } // walk and paint all areas } // if slider area is not empty and visible rcArea = m_ActiveRect; rcArea.DeflateRect( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * pSite = GetBar()->GetCustomizeSite(); if( pSite != NULL && pSite->IsCustomizeMode() && pSite->CustomizedNodeGet() != NULL && pSite->CustomizedNodeGet() == GetCmdNode( false ) ) { g_PaintManager->PaintDragSourceRect( dc, rcArea ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) } void CExtBarSliderButton::OnPaintScrollArea( CDC & dc, CExtBarSliderButton::e_SliderArea_t eSA, bool bHorz ) { ASSERT_VALID( this ); ASSERT_VALID( (&dc) ); ASSERT_VALID( m_pBar ); ASSERT( 0 <= eSA && eSA < __ESA_COUNT ); CRect rcArea = GetAreaRect( eSA ); if( rcArea.right < rcArea.left || rcArea.bottom < rcArea.top || ( ! dc.RectVisible(&rcArea) ) ) return; bool bFlatButton = false; bool bDockSiteCustomizeMode = GetBar()->_IsDockSiteCustomizeMode(); bool bEnabled = ( IsDisabled() && (!bDockSiteCustomizeMode) ) ? false : true; if( bEnabled ) { ULONG nScrollPageSize = ScrollPageSizeGet(); ULONG nScrollTotalRange = ScrollTotalRangeGet(); if( nScrollPageSize >= nScrollTotalRange || nScrollTotalRange == 0L ) bEnabled = false; } // if( bEnabled ) bool bHover = ( IsHover() && bEnabled && (!bDockSiteCustomizeMode) ) ? true : false; bool bPushed = ( GetPressedArea() == eSA && bEnabled && (!bDockSiteCustomizeMode) ) ? true : false; if( !bDockSiteCustomizeMode ) { if( CExtToolControlBar::g_bMenuTracking || CExtPopupMenuWnd::IsMenuTracking() ) bHover = false; else if( !bHover ) bHover = IsPressedTracking(); } // if( !bDockSiteCustomizeMode ) CExtPaintManager::glyph_t * pBtnGlyph = NULL; bool bPaintAsButton = false; INT nExtentBtn = bHorz ? ScrollButtonExtentHorzGet() : ScrollButtonExtentVertGet(); switch( eSA ) { case __ESA_LINE_UP: bPaintAsButton = true; pBtnGlyph = bHorz ? CExtPaintManager::g_DockingCaptionGlyphs[ CExtPaintManager::__DCBT_ARROW_LEFT ] : CExtPaintManager::g_DockingCaptionGlyphs[ CExtPaintManager::__DCBT_ARROW_UP ]; bFlatButton = bPushed; // bPushed = false; break; case __ESA_LINE_DOWN: bPaintAsButton = true; pBtnGlyph = bHorz ? CExtPaintManager::g_DockingCaptionGlyphs[ CExtPaintManager::__DCBT_ARROW_RIGHT ] : CExtPaintManager::g_DockingCaptionGlyphs[ CExtPaintManager::__DCBT_ARROW_DOWN ]; bFlatButton = bPushed; // bPushed = false; break; case __ESA_THUMB: bPaintAsButton = true; //bFlatButton = bPushed; bPushed = false; break; case __ESA_SCROLLABLE: if( nExtentBtn != 0 ) { dc.FillRect( rcArea, (bHover && bEnabled) ? ( & g_PaintManager->m_brushLightestDefault ) : ( & g_PaintManager->m_brushLightDefault ) ); rcArea.InflateRect( bHorz ? 1 : 0, bHorz ? 0 : 1 ); } // if( nExtentBtn != 0 ) else { rcArea.DeflateRect( bHorz ? 0 : (rcArea.Width()/2), bHorz ? (rcArea.Height()/2) : 0 ); rcArea.InflateRect( bHorz ? 0 : 1, bHorz ? 1 : 0 ); if( bEnabled && bHover ) { dc.FillSolidRect( &rcArea, g_PaintManager->GetColor(COLOR_3DDKSHADOW) ); rcArea.DeflateRect( 1, 1 ); dc.FillRect( &rcArea, &g_PaintManager->m_brushLightestDefault ); } // if( bEnabled && bHover ) else { dc.FillRect( &rcArea, &g_PaintManager->m_brushDarkestDefault ); rcArea.DeflateRect( 1, 1 ); dc.FillRect( &rcArea, &g_PaintManager->m_brushLighterDefault ); } // else from if( bEnabled && bHover ) } // else from if( nExtentBtn != 0 ) return; case __ESA_PAGE_UP: case __ESA_PAGE_DOWN: if( nExtentBtn != 0 ) { if( bHover || bPushed ) dc.FillRect( rcArea, bPushed ? &g_PaintManager->m_brushDarkestDefault : &g_PaintManager->m_brushLightestDefault ); } // if( nExtentBtn != 0 ) return; } // switch( eSA ) if( bPaintAsButton ) { bool bIndeterminate = ( IsIndeterminate() && (!bDockSiteCustomizeMode) ) ? true : false; CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd( this, bHorz, rcArea, _T(""), NULL, bFlatButton, bHover, bPushed, bIndeterminate, bEnabled, !bFlatButton, //true, false, false, CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT, NULL, false, 0, false ); g_PaintManager->PaintPushButton( dc, _ppbd ); if( pBtnGlyph != NULL ) { if( bPushed ) rcArea.OffsetRect( g_PaintManager->GetPushedOffset() ); COLORREF ColorValues[] = { RGB(0,0,0), g_PaintManager->GetColor( bEnabled ? ( (bHover || bPushed) ? CExtPaintManager::CLR_TEXT_IN : CExtPaintManager::CLR_TEXT_OUT ) : CExtPaintManager::CLR_TEXT_DISABLED ) }; g_PaintManager->PaintGlyphCentered( dc, rcArea, *pBtnGlyph, ColorValues ); } // if( pBtnGlyph != NULL ) return; } // if( bPaintAsButton ) } CExtBarSliderButton::e_SliderArea_t CExtBarSliderButton::GetTrackedArea() const { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); return m_eAreaTracked; } CExtBarSliderButton::e_SliderArea_t CExtBarSliderButton::GetPressedArea() const { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); return m_eAreaPressed; } CRect CExtBarSliderButton::GetAreaRect( CExtBarSliderButton::e_SliderArea_t eSA ) const { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); ASSERT( 0 <= eSA && eSA < __ESA_COUNT ); return m_arrAreaRects[eSA]; } UINT CExtBarSliderButton::OnTrackPopup( CPoint point, bool bSelectAny ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); point; bSelectAny; return UINT(-1L); } void CExtBarSliderButton::OnHover( CPoint point, bool bOn ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); bool bDockSiteCustomizeMode = m_pBar->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return; CExtBarButton::OnHover( point, bOn ); } void CExtBarSliderButton::OnClick( CPoint point, bool bDown ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); bool bDockSiteCustomizeMode = m_pBar->_IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return; CExtBarButton::OnClick( point, bDown ); if( m_pBar->m_pDockSite != NULL ) { if( m_pBar->m_pDockSite->m_bHelpMode ) return; } // if( m_pBar->m_pDockSite != NULL ) m_eAreaTracked = m_eAreaPressed = __ESA_UNKNOWN_OR_NOWHERE; if( !bDown ) { RedrawButton( true ); return; } ULONG nScrollLimit = ScrollLimitGet(); if( nScrollLimit == 0L ) { RedrawButton( true ); return; } ULONG nScrollPos = ScrollPosGet(); ULONG nScrollPosStart = nScrollPos; for( int nRectNo = __ESA_CLICKABLE_RANGE_FIRST; nRectNo <= __ESA_CLICKABLE_RANGE_LAST; nRectNo++ ) { if( m_arrAreaRects[nRectNo].right <= m_arrAreaRects[nRectNo].left || m_arrAreaRects[nRectNo].bottom <= m_arrAreaRects[nRectNo].top ) continue; if( m_arrAreaRects[nRectNo].PtInRect(point) ) { m_eAreaTracked = (e_SliderArea_t)nRectNo; break; } } RedrawButton( true ); if( m_eAreaTracked == __ESA_UNKNOWN_OR_NOWHERE ) return; bool bHorz = GetBar()->IsDockedVertically() ? false : true; if( GetNoRotateVerticalLayout() ) bHorz = true; e_SliderArea_t eSA = m_eAreaTracked; CRect rcArea = GetAreaRect( eSA ); const UINT nTimerID = 401; const UINT nTimerEllapse = 50; HWND hWndOwnBar = m_pBar->GetSafeHwnd(); ASSERT( hWndOwnBar != NULL && ::IsWindow( hWndOwnBar ) ); bool bStopFlag = false; CPoint ptCursor( point ); ULONG nStepSize = 0L; bool bUpStep = false; switch( eSA ) { case __ESA_LINE_UP: bUpStep = true; case __ESA_LINE_DOWN: nStepSize = 1L; break; case __ESA_PAGE_UP: bUpStep = true; case __ESA_PAGE_DOWN: nStepSize = ScrollPageSizeGet(); if( nStepSize == 0L ) nStepSize = 1L; break; case __ESA_THUMB: m_eAreaPressed = eSA; RedrawButton(); break; } // switch( eSA ) if( nStepSize > nScrollLimit ) nStepSize = nScrollLimit; ::SetCapture( hWndOwnBar ); if( nStepSize != 0L ) ::SetTimer( hWndOwnBar, nTimerID, nTimerEllapse, NULL ); for( MSG msg; ::IsWindow( hWndOwnBar ) && (!bStopFlag); ) { if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { if( ! ::IsWindow( hWndOwnBar ) ) break; ::WaitMessage(); continue; } // if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) bool bAnalyzeThumb = false; switch( msg.message ) { case WM_LBUTTONDBLCLK: case WM_LBUTTONUP: case WM_RBUTTONDBLCLK: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDBLCLK: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_CANCELMODE: case WM_ACTIVATEAPP: case WM_KEYDOWN: case WM_KEYUP: bStopFlag = true; break; case WM_CAPTURECHANGED: if( (HWND)msg.wParam != hWndOwnBar ) bStopFlag = true; break; case WM_MOUSEMOVE: if( eSA == __ESA_THUMB ) { if( ( ! CExtPopupMenuWnd::IsKeyPressed(VK_LBUTTON) ) || CExtPopupMenuWnd::IsKeyPressed(VK_MBUTTON) || CExtPopupMenuWnd::IsKeyPressed(VK_RBUTTON) || CExtPopupMenuWnd::IsMenuTracking() ) { bStopFlag = true; break; } PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); bAnalyzeThumb = true; ::GetCursorPos( &ptCursor ); ::ScreenToClient( hWndOwnBar, &ptCursor ); break; } // if( eSA == __ESA_THUMB ) if( nStepSize == 0 ) break; case WM_TIMER: if( ( ! CExtPopupMenuWnd::IsKeyPressed(VK_LBUTTON) ) || CExtPopupMenuWnd::IsKeyPressed(VK_MBUTTON) || CExtPopupMenuWnd::IsKeyPressed(VK_RBUTTON) || CExtPopupMenuWnd::IsMenuTracking() ) { bStopFlag = true; break; } if( msg.message == WM_TIMER ) { if( msg.wParam != nTimerID ) break; } // if( msg.message == WM_TIMER ) ASSERT( nStepSize != 0L ); PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); ::GetCursorPos( &ptCursor ); ::ScreenToClient( hWndOwnBar, &ptCursor ); if( ! rcArea.PtInRect(ptCursor) ) { if( m_eAreaPressed != __ESA_UNKNOWN_OR_NOWHERE ) { m_eAreaPressed = __ESA_UNKNOWN_OR_NOWHERE; RedrawButton( true ); } continue; } if( bUpStep ) { if( nScrollPos == 0L ) { nScrollPos = ScrollPosGet(); nScrollLimit = ScrollLimitGet(); break; } if( nScrollPos < nStepSize ) nScrollPos = 0L; else nScrollPos -= nStepSize; } // if( bUpStep ) else { if( nScrollPos >= nScrollLimit ) { nScrollPos = ScrollPosGet(); nScrollLimit = ScrollLimitGet(); break; } if( nStepSize > (nScrollLimit-nScrollPos) ) nScrollPos = nScrollLimit; else nScrollPos += nStepSize; ASSERT( nScrollPos <= nScrollLimit ); } // else from if( bUpStep ) ScrollPosSet( nScrollPos ); nScrollPos = ScrollPosGet(); nScrollLimit = ScrollLimitGet(); RecalcSliderLayout(); rcArea = GetAreaRect( eSA ); m_eAreaPressed = eSA; RedrawButton( true ); break; default: if( ( ! CExtPopupMenuWnd::IsKeyPressed(VK_LBUTTON) ) || CExtPopupMenuWnd::IsKeyPressed(VK_MBUTTON) || CExtPopupMenuWnd::IsKeyPressed(VK_RBUTTON) || CExtPopupMenuWnd::IsMenuTracking() ) bStopFlag = true; break; } // switch( msg.message ) if( bStopFlag || nScrollLimit == 0L ) break; if( bAnalyzeThumb ) { LONG nPixelOffset = bHorz ? (ptCursor.x - point.x) : (ptCursor.y - point.y); LONG nPixelExtent = bHorz ? (m_arrAreaRects[__ESA_SCROLLABLE].Width() - m_arrAreaRects[__ESA_THUMB].Width()) : (m_arrAreaRects[__ESA_SCROLLABLE].Height() - m_arrAreaRects[__ESA_THUMB].Height()); if( nPixelExtent <= 0 ) { bStopFlag = true; break; } // if( nPixelExtent <= 0 ) if( abs(nPixelOffset) > nPixelExtent ) nPixelOffset = (nPixelOffset < 0) ? (-nPixelExtent) : nPixelExtent; ULONG nShift = ( nPixelExtent == 0 || nPixelOffset == 0 ) ? 0 : ::MulDiv( nScrollLimit, abs(nPixelOffset), nPixelExtent ); nScrollPos = nScrollPosStart; if( nPixelOffset < 0 ) { if( nShift >= nScrollPos ) nScrollPos = 0; else nScrollPos -= nShift; } // if( nPixelOffset < 0 ) else { if( nScrollPos >= nScrollLimit ) { nScrollPos = ScrollPosGet(); nScrollLimit = ScrollLimitGet(); break; } if( nShift > (nScrollLimit-nScrollPos) ) nScrollPos = nScrollLimit; else nScrollPos += nShift; ASSERT( nScrollPos <= nScrollLimit ); } // else from if( nPixelOffset < 0 ) ScrollPosSet( nScrollPos ); nScrollPos = ScrollPosGet(); nScrollLimit = ScrollLimitGet(); RecalcSliderLayout(); rcArea = GetAreaRect( eSA ); m_eAreaPressed = eSA; RedrawButton( true ); continue; } // if( bAnalyzeThumb ) if( !AfxGetThread()->PumpMessage() ) break; } // for( MSG msg; ::IsWindow( hWndOwnBar ) && (!bStopFlag); ) if( ! ::IsWindow( hWndOwnBar ) ) return; if( nStepSize != 0L ) ::KillTimer( hWndOwnBar, nTimerID ); m_eAreaTracked = m_eAreaPressed = __ESA_UNKNOWN_OR_NOWHERE; RedrawButton( true ); if( ::GetCapture() == hWndOwnBar ) ::ReleaseCapture(); } void CExtBarSliderButton::OnDeliverCmd() { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); //CExtBarButton::OnDeliverCmd(); } int CExtBarSliderButton::OnToolHitTest( CPoint point, TOOLINFO * pTI ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); return CExtBarButton::OnToolHitTest( point, pTI ); } LRESULT CExtBarSliderButton::OnHelpHitTest( CPoint point ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); return CExtBarButton::OnHelpHitTest( point ); } void CExtBarSliderButton::OnUpdateCmdUI( CWnd * pTarget, BOOL bDisableIfNoHndler, int nIndex ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); CExtBarButton::OnUpdateCmdUI( pTarget, bDisableIfNoHndler, nIndex ); } bool CExtBarSliderButton::OnSetCursor( CPoint point ) { ASSERT_VALID( this ); ASSERT_VALID( m_pBar ); return CExtBarButton::OnSetCursor( point ); } ///////////////////////////////////////////////////////////////////////////// // CExtToolControlBar const UINT CExtToolControlBar::g_nMsgTrackButtonMenu = ::RegisterWindowMessage( _T("CExtToolControlBar::g_nMsgTrackButtonMenu") ); const UINT CExtToolControlBar::g_nMsgContinueTrackMenu = ::RegisterWindowMessage( _T("CExtToolControlBar::g_nMsgContinueTrackMenu") ); IMPLEMENT_DYNCREATE(CExtToolControlBar, CExtControlBar) CExtBarButton * CExtToolControlBar::_GetButtonPtr(int nIndex) const { int nButtonsCount = m_buttons.GetSize(); if( !(nIndex >= 0 && nIndex < nButtonsCount) ) { ASSERT( FALSE ); return NULL; } CExtBarButton * pTBB = m_buttons[nIndex]; ASSERT_VALID( pTBB ); return pTBB; } void CExtToolControlBar::_RemoveAllButtonsImpl() { if( m_pRightBtn != NULL ) m_pRightBtn->GetButtons().RemoveAll(); for( INT nBtnIdx = 0; nBtnIdx < m_buttons.GetSize(); nBtnIdx++ ) { CExtBarButton * pTBB = m_buttons[nBtnIdx]; ASSERT( pTBB != NULL ); delete pTBB; } m_buttons.RemoveAll(); m_pRightBtn = NULL; m_nBtnIdxCapture = -1; // nothing captured m_nBtnIdxHover = -1; m_nBtnIdxMenuTracking = -1; } int CExtToolControlBar::_GetButtonsCountImpl() const { int nCountOfButtons = m_buttons.GetSize(); return nCountOfButtons; } void CExtToolControlBar::_SetCursor( const CPoint & point ) { ASSERT_VALID( this ); int nBtnIdx = _HitTestImpl(point); if( nBtnIdx >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->OnSetCursor(point) ) return; } // if( nBtnIdx >= 0 ) CExtControlBar::_SetCursor( point ); } bool CExtToolControlBar::g_bMenuTracking = false; bool CExtToolControlBar::g_bMenuTrackingExpanded = false; bool CExtToolControlBar::g_bToolbarLargeIcons = false; bool CExtToolControlBar::g_bToolbarScreenTips = true; bool CExtToolControlBar::g_bToolbarShortcutKeysOnScreenTips = false; const CSize CExtToolControlBar::g_sizeDefTBB( 23, 22 ); CExtToolControlBar::CExtToolControlBar() { m_bGripperStaticallyAtTop = false; m_pRightBtn = NULL; m_bRightButtonDisplayBarsList = true; m_bPaletteMode = false; m_bHelperTempFullRowMode = false; m_bInsideCalcLayout = false; m_bFixedMode = true; m_bReposSingleChildMode = false; m_nBtnIdxCapture = -1; m_nBtnIdxHover = -1; m_nBtnIdxMenuTracking = -1; #if (!defined __EXT_MFC_NO_CUSTOMIZE) m_bCustomizationAllowed = true; m_pCustomizeSite = NULL; m_bVisibleInCustomizeListBox = true; m_pDragSourceTBB = NULL; m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; m_bHelperSeparatorAction = false; #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) // additional spaces m_cxLeftBorder = 1; m_cxRightBorder = 1; m_cyTopBorder = 0; //1; m_cyBottomBorder = 0; //1; m_nGripWidthAtLeft = 8; m_nGripHeightAtTop = 10; } CExtToolControlBar::~CExtToolControlBar() { _RemoveAllButtonsImpl(); CSingleLock _slCsCB( &g_csCB ); _slCsCB.Lock(); int nCountOfBars = g_AllBars.GetSize(); for( int i=0; i<nCountOfBars; i++ ) { CExtControlBar * pBar = g_AllBars[i]; ASSERT( pBar != NULL ); if( pBar == this ) { g_AllBars.RemoveAt( i ); break; } } _slCsCB.Unlock(); } BOOL CExtToolControlBar::LoadToolBar( __EXT_MFC_SAFE_LPCTSTR lpszResourceName ) { LPUINT pCmdArray = NULL; INT nCmdCount = 0; if( !g_CmdManager->UpdateFromToolBar( g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ), lpszResourceName, &pCmdArray, &nCmdCount ) ) { ASSERT( FALSE ); return FALSE; } ASSERT( pCmdArray != NULL && nCmdCount > 0 ); BOOL bRetVal = SetButtons( pCmdArray, nCmdCount ); ASSERT( bRetVal ); delete [] pCmdArray; return bRetVal; } bool CExtToolControlBar::_IsShowContentWhenDragging() const { //BOOL bDragShowContent = FALSE; // ::SystemParametersInfo( // SPI_GETDRAGFULLWINDOWS, // 0, // &bDragShowContent, // 0 // ); // return bDragShowContent ? true : false; // if( IsKindOf(RUNTIME_CLASS(CExtToolControlBar)) ) // return true; // return false; // if( CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) ) // return false; return true; } BOOL CExtToolControlBar::RemoveButton( int nPos, BOOL bDoRecalcLayout // = TRUE ) { if( nPos < 0 ) { ASSERT( FALSE ); return FALSE; } int nCountOfButtons = _GetButtonsCountImpl(); if( nPos >= nCountOfButtons ) { ASSERT( FALSE ); return FALSE; } CExtBarButton * pTBB = _GetButtonPtr( nPos ); ASSERT_VALID( pTBB ); if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) { ASSERT( FALSE ); return FALSE; } delete pTBB; m_buttons.RemoveAt( nPos ); m_nBtnIdxCapture = -1; // nothing captured m_nBtnIdxHover = -1; m_nBtnIdxMenuTracking = -1; if( bDoRecalcLayout ) _RecalcLayoutImpl(); return TRUE; } BOOL CExtToolControlBar::InsertSpecButton( int nPos, // -1 - append CExtBarButton * pButton, BOOL bDoRecalcLayout // = TRUE ) { int nCountOfButtons = _GetButtonsCountImpl(); if( nPos < 0 ) nPos = nCountOfButtons; if( nPos > nCountOfButtons ) { ASSERT( FALSE ); return FALSE; } if( nCountOfButtons > 0 && nPos == nCountOfButtons ) { CExtBarButton * pTBB = _GetButtonPtr( nCountOfButtons - 1 ); ASSERT_VALID( pTBB ); if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) nPos--; } ASSERT_VALID( pButton ); ASSERT( pButton->GetSafeBar() != NULL ); ASSERT( pButton->GetSafeBar() == this ); if( _GetIndexOf(pButton) >= 0 ) { ASSERT( FALSE ); // already inserted return FALSE; } m_buttons.InsertAt( nPos, pButton ); ASSERT( _GetIndexOf(pButton) >= 0 ); if( bDoRecalcLayout ) _RecalcLayoutImpl(); return TRUE; } BOOL CExtToolControlBar::InsertButton( int nPos, // = -1, // append UINT nCmdID, // = ID_SEPARATOR BOOL bDoRecalcLayout // = TRUE ) { int nCountOfButtons = _GetButtonsCountImpl(); if( nPos < 0 ) nPos = nCountOfButtons; if( nPos > nCountOfButtons ) { ASSERT( FALSE ); return FALSE; } if( nCountOfButtons > 0 && nPos == nCountOfButtons ) { CExtBarButton * pTBB = _GetButtonPtr( nCountOfButtons - 1 ); ASSERT_VALID( pTBB ); if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) nPos--; } try { CExtBarButton * pTBB = OnCreateBarCommandBtn( nCmdID ); ASSERT_VALID( pTBB ); m_buttons.InsertAt( nPos, pTBB ); if( bDoRecalcLayout ) _RecalcLayoutImpl(); } // try // catch( std::exception * pXept ) // { // delete pXept; // ASSERT( FALSE ); // return FALSE; // } // catch( std::exception * pXept ) catch( CException * pXept ) { pXept->Delete(); ASSERT( FALSE ); return FALSE; } // catch( CException * pXept ) catch( ... ) { ASSERT( FALSE ); return FALSE; } // catch( ... ) return TRUE; } CExtBarButton * CExtToolControlBar::OnCreateBarCommandBtn( UINT nCmdID, UINT nStyle // = 0 ) { ASSERT_VALID( this ); CExtBarButton * pTBB = new CExtBarButton( this, nCmdID, nStyle ); ASSERT_VALID( pTBB ); return pTBB; } CExtBarContentExpandButton * CExtToolControlBar::OnCreateBarRightBtn() { ASSERT_VALID( this ); if( m_bPaletteMode ) return NULL; CExtBarContentExpandButton * pRightBtn = new CExtBarContentExpandButton( this ); ASSERT_VALID( pRightBtn ); return pRightBtn; } BOOL CExtToolControlBar::SetButtons( const UINT * lpIDArray, // = NULL int nIDCount // = 0 ) { ASSERT_VALID( this ); ASSERT( lpIDArray == NULL || nIDCount == 0 || AfxIsValidAddress( lpIDArray, sizeof(UINT) * nIDCount, FALSE ) ); _RemoveAllButtonsImpl(); if( lpIDArray == NULL || nIDCount == 0 ) return TRUE; try { for( int i = 0; i < nIDCount; i++ ) { CExtBarButton * pTBB = OnCreateBarCommandBtn( *lpIDArray++, 0 ); ASSERT_VALID( pTBB ); m_buttons.Add( pTBB ); } // for( int i = 0; i < nIDCount; i++ ) ASSERT( m_pRightBtn == NULL ); m_pRightBtn = OnCreateBarRightBtn(); if( m_pRightBtn != NULL ) { ASSERT_VALID( m_pRightBtn ); ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn ); m_buttons.Add( m_pRightBtn ); } // if( m_pRightBtn != NULL ) } // try catch( CException * pXept ) { pXept->Delete(); ASSERT( FALSE ); return FALSE; } // catch( CException * pXept ) catch( ... ) { ASSERT( FALSE ); return FALSE; } // catch( ... ) return TRUE; } #if (!defined __EXT_MFC_NO_CUSTOMIZE) BOOL CExtToolControlBar::SetButtons( CExtCustomizeCmdTreeNode * pNode ) { ASSERT_VALID( this ); SetButtons(); if( pNode == NULL ) return TRUE; ASSERT_VALID( pNode ); CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite == NULL ) { ASSERT( FALSE ); return FALSE; } int nCount = pNode->GetNodeCount(); for( int i = 0; i < nCount; i++ ) { CExtCustomizeCmdTreeNode * pNodeBtn = pNode->ElementAt( i ); ASSERT_VALID( pNodeBtn ); if( pNodeBtn->GetFlags() & __ECTN_GROUP_START ) { if( i == 0 ) { ASSERT( FALSE ); continue; } VERIFY( InsertButton(-1,ID_SEPARATOR,FALSE) ); // separator } ASSERT( CExtCmdManager::IsCommand(pNodeBtn->GetCmdID(false)) || pNodeBtn->GetCmdID(false) == UINT(-1) ); ASSERT( CExtCmdManager::IsCommand(pNodeBtn->GetCmdID(true)) || pNodeBtn->GetCmdID(true) == UINT(-1) ); CExtBarButton * pTBB = pSite->OnCreateToolbarButton( this, NULL, pNodeBtn ); if( pTBB == NULL ) { ASSERT( FALSE ); return FALSE; } ASSERT_VALID( pTBB ); m_buttons.Add( pTBB ); } // for( int i = 0; i < nCount; i++ ) ASSERT( m_pRightBtn == NULL ); m_pRightBtn = OnCreateBarRightBtn(); if( m_pRightBtn != NULL ) { ASSERT_VALID( m_pRightBtn ); ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn ); m_buttons.Add( m_pRightBtn ); } // if( m_pRightBtn != NULL ) return TRUE; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) bool CExtToolControlBar::IsLargeIcons() const { ASSERT_VALID( this ); return g_bToolbarLargeIcons; } bool CExtToolControlBar::IsDisplayScreenTips() const { ASSERT_VALID( this ); return g_bToolbarScreenTips; } bool CExtToolControlBar::IsDisplayShortcutKeysOnScreenTips() const { ASSERT_VALID( this ); return g_bToolbarShortcutKeysOnScreenTips; } LRESULT CExtToolControlBar::DoHelpHitTest( CPoint ptHelpHitTest ) { ASSERT_VALID( this ); LRESULT nHelpHit = ((CExtToolControlBar*)this)-> HitTest(ptHelpHitTest); if( nHelpHit >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr( nHelpHit ); ASSERT_VALID( pTBB ); if( pTBB != NULL ) { nHelpHit = pTBB->OnHelpHitTest( ptHelpHitTest ); if( nHelpHit == -1 || nHelpHit == -2 ) return -2; return nHelpHit; } } // if( nHelpHit >= 0 ) return CExtControlBar::DoHelpHitTest( ptHelpHitTest ); } ///////////////////////////////////////////////////////////////////////////// // CExtToolControlBar attribute access int CExtToolControlBar::CommandToIndex(UINT nIDFind) const { ASSERT_VALID(this); int nCountOfButtons = _GetButtonsCountImpl(); for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->GetCmdID(false) == nIDFind ) return nBtnIdx; } return -1; } UINT CExtToolControlBar::GetButtonID(int nIndex) const { // ASSERT_VALID(this); CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) return ID_SEPARATOR; ASSERT_VALID( pTBB ); return pTBB->GetCmdID(false); } void CExtToolControlBar::GetButtonRect(int nIndex, LPRECT lpRect) const { // ASSERT_VALID(this); ASSERT(AfxIsValidAddress(lpRect, sizeof(RECT))); CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) { ::memset( lpRect, 0, sizeof(RECT) ); return; } ASSERT_VALID( pTBB ); *lpRect = *pTBB; } UINT CExtToolControlBar::GetButtonStyle(int nIndex) const { CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) return 0; ASSERT_VALID( pTBB ); return pTBB->GetStyle(); } void CExtToolControlBar::SetButtonStyle(int nIndex, UINT nStyle) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) return; ASSERT_VALID( pTBB ); UINT nOldStyle = pTBB->GetStyle(); if( nOldStyle != nStyle ) { pTBB->SetStyle( nStyle ); _InvalidateButton( nIndex ); UpdateWindow(); } } CWnd * CExtToolControlBar::GetButtonCtrl( int nIndex ) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return NULL; ASSERT_VALID( pTBB ); CWnd * pCtrl = pTBB->CtrlGet(); return pCtrl; } void CExtToolControlBar::SetButtonCtrlVisibleVertically( int nIndex, bool bVisible // = true ) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return; pTBB->SetCtrlVisibleVertically( bVisible ); } bool CExtToolControlBar::GetButtonCtrlVisibleVertically( int nIndex ) const { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return false; return pTBB->GetCtrlVisibleVertically(); } bool CExtToolControlBar::SetButtonCtrl( int nIndex, CWnd * pCtrl, // = NULL bool bCtrlAutoDestroyed // = TRUE ) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return FALSE; ASSERT_VALID( pTBB ); if( pCtrl != NULL ) { ASSERT_VALID( pCtrl ); DWORD dwCtrlStyle = pCtrl->GetStyle(); ASSERT( (dwCtrlStyle&WS_CHILD) != 0 ); if( (dwCtrlStyle&WS_CHILD) == 0 ) return FALSE; ASSERT( IsChild( pCtrl ) ); if( !IsChild( pCtrl ) ) return FALSE; UINT nDlgCtrlID = (UINT)pCtrl->GetDlgCtrlID(); ASSERT( nDlgCtrlID == pTBB->GetCmdID(false) ); if( nDlgCtrlID != pTBB->GetCmdID(false) ) return FALSE; } pTBB->CtrlSet( pCtrl, bCtrlAutoDestroyed ); _RecalcLayoutImpl(); return TRUE; } int CExtToolControlBar::GetButtonByAccessKey(__EXT_MFC_SAFE_TCHAR vkTCHAR) { int nCountOfButtons = _GetButtonsCountImpl(); ASSERT( nCountOfButtons >= 0 ); if( nCountOfButtons == 0 ) return -1; for( int nBtnIdx=0; nBtnIdx<nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr(nBtnIdx); ASSERT_VALID( pTBB ); if( pTBB->IsSeparator() || (! pTBB->IsVisible() ) || ( pTBB->GetStyle() & TBBS_HIDDEN ) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton)) ) continue; ASSERT( CExtCmdManager::IsCommand(pTBB->GetCmdID(false)) ); ASSERT( CExtCmdManager::IsCommand(pTBB->GetCmdID(true)) ); CExtSafeString strButtonText( pTBB->GetText() ); if( strButtonText.IsEmpty() ) continue; int nTextLen = strButtonText.GetLength(); ASSERT( nTextLen > 0 ); int nAmdIndex = strButtonText.Find(_T('&')); if( nAmdIndex == nTextLen - 1 ) // !?!?! continue; TCHAR vk = strButtonText[nAmdIndex+1]; TCHAR szChar[2] = { vk, _T('\0') }; ::CharUpper( szChar ); vk = szChar[0]; if( vkTCHAR == ((TCHAR)vk) ) { if( ( !pTBB->IsVisible() ) || (pTBB->GetStyle() & TBBS_HIDDEN) != 0 ) { if( m_pRightBtn != NULL ) return _GetIndexOf( m_pRightBtn ); continue; } return nBtnIdx; } // if( vkTCHAR == ((TCHAR)vk) ) } // for( int nBtnIdx=0; nBtnIdx<nCountOfButtons; nBtnIdx++ ) return -1; } HMENU CExtToolControlBar::GetButtonMenu( int nIndex ) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return NULL; ASSERT_VALID( pTBB ); return ((HMENU)(*pTBB)); } bool CExtToolControlBar::MarkButtonAsMdiWindowsMenu( int nIndex, bool bAppendMdiWindowsMenu // = TRUE ) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return false; ASSERT_VALID( pTBB ); pTBB->SetAppendMdiWindowsMenu( bAppendMdiWindowsMenu ); return true; } bool CExtToolControlBar::SetButtonMenu( int nIndex, HMENU hMenu, // = NULL bool bPopupMenu, // = TRUE bool bAutoDestroyMenu, // = TRUE bool bDoRecalcLayout // = TRUE ) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return false; ASSERT_VALID( pTBB ); pTBB->SetMenu( hMenu, bPopupMenu, bAutoDestroyMenu ); if( bDoRecalcLayout ) _RecalcLayoutImpl(); return true; } int CExtToolControlBar::GetVisibleButton( int nBtnIdx, BOOL bNext, BOOL bPassDisabled // = TRUE ) { int nCountOfButtons = _GetButtonsCountImpl(); ASSERT( nCountOfButtons >= 0 ); if( nCountOfButtons == 0 ) return -1; if( nCountOfButtons == 1 ) return 0; if( bNext ) { int iNewButton = nBtnIdx + 1; if( iNewButton >= nCountOfButtons ) iNewButton = 0; while( iNewButton != nBtnIdx ) { CExtBarButton * pTBB = _GetButtonPtr(iNewButton); ASSERT_VALID( pTBB ); if( pTBB->IsVisible() && (pTBB->GetStyle() & TBBS_HIDDEN) == 0 && (!pTBB->IsSeparator()) && (!pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton))) && ( (!bPassDisabled) || (bPassDisabled && (!pTBB->IsDisabled())) ) ) { return iNewButton; } iNewButton++; if( iNewButton >= nCountOfButtons ) iNewButton = 0; } return iNewButton; } // if( bNext ) else { int iNewButton = nBtnIdx - 1; if( iNewButton < 0 ) iNewButton = nCountOfButtons - 1; while( iNewButton != nBtnIdx ) { CExtBarButton * pTBB = _GetButtonPtr(iNewButton); ASSERT_VALID( pTBB ); if( pTBB->IsVisible() && (pTBB->GetStyle() & TBBS_HIDDEN ) == 0 && (!pTBB->IsSeparator()) && (!pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton))) && ( (!bPassDisabled) || (bPassDisabled && (!pTBB->IsDisabled())) ) ) return iNewButton; iNewButton--; if( iNewButton < 0 ) iNewButton = nCountOfButtons - 1; } return iNewButton; } // else from if( bNext ) } BOOL CExtToolControlBar::TrackButtonMenu( int nIndex, BOOL bSelectAny, // = FALSE BOOL bDelayedTracking // = FALSE ) { bool bDockSiteCustomizeMode = _IsDockSiteCustomizeMode(); if( bDockSiteCustomizeMode ) return FALSE; if( g_bMenuTracking && m_nBtnIdxMenuTracking == nIndex ) return TRUE; if( !SafeDisplayBar() ) return FALSE; CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT( pTBB != NULL ); if( pTBB == NULL ) return FALSE; ASSERT_VALID( pTBB ); if( pTBB->GetStyle() & (TBBS_HIDDEN|TBBS_DISABLED) ) return FALSE; if( !pTBB->IsAbleToTrackMenu() ) return FALSE; CPoint point; if( ! ::GetCursorPos(&point) ) return FALSE; ScreenToClient( &point ); if( bDelayedTracking ) PostMessage( g_nMsgTrackButtonMenu, (WPARAM)nIndex ); else pTBB->OnTrackPopup( point, bSelectAny ? true : false ); return TRUE; } CSize CExtToolControlBar::CalcDynamicLayout(int nLength, DWORD dwMode) { if( (nLength == -1) && !(dwMode & (LM_MRUWIDTH|LM_COMMIT)) && (dwMode & (LM_HORZDOCK|LM_VERTDOCK)) ) return CalcFixedLayout( dwMode & LM_STRETCH, dwMode & LM_HORZDOCK ); ASSERT( (dwMode&(LM_HORZ|LM_HORZDOCK)) || (!(dwMode&LM_HORZDOCK)) ); return _CalcLayout( dwMode, nLength ); } CSize CExtToolControlBar::CalcFixedLayout( BOOL bStretch, BOOL bHorz ) { DWORD dwMode = bStretch ? LM_STRETCH : 0; dwMode |= bHorz ? LM_HORZ : 0; ASSERT( (dwMode&(LM_HORZ|LM_HORZDOCK)) || (!(dwMode&LM_HORZDOCK)) ); return _CalcLayout( dwMode ); } CSize CExtToolControlBar::_CalcLayout( DWORD dwMode, int nLength ) { ASSERT_VALID(this); if( !m_bInsideCalcLayout ) m_bHelperTempFullRowMode = false; CSize sizeDefButton = _GetDefButtonSize(); CSize sizeCalcLayout = sizeDefButton; if( _GetButtonsCountImpl() > 0 ) { if( m_pRightBtn != NULL ) m_pRightBtn->ClearContent( false ); BOOL bDynamic = m_dwStyle & CBRS_SIZE_DYNAMIC; INT nLengthToSizeTB = (dwMode & LM_HORZ) ? 32767 : 0; BOOL bVertSizeTB = FALSE; if( bDynamic ) { if( dwMode & LM_MRUWIDTH ) nLengthToSizeTB = m_nMRUWidth; else if( dwMode & LM_HORZDOCK ) nLengthToSizeTB = 32767; else if( dwMode & LM_VERTDOCK ) nLengthToSizeTB = 0; else if( nLength != -1 ) { CRect rcInside( 0, 0, 0, 0 ); _CalcInsideRect( rcInside, (dwMode & LM_HORZ) ); bVertSizeTB = (dwMode & LM_LENGTHY); nLengthToSizeTB = nLength + ( bVertSizeTB ? rcInside.Height() : rcInside.Width() ); } else if( (m_dwStyle & CBRS_FLOATING) != 0 ) nLengthToSizeTB = m_nMRUWidth; } // if( bDynamic ) bool bMultiRowLayout = OnQueryMultiRowLayout(); if( bMultiRowLayout && ((dwMode & LM_HORZ) == 0) && (!m_bPaletteMode) ) { CRect rcDockBarClient; if( m_pDockBar != NULL ) m_pDockBar->GetClientRect( &rcDockBarClient ); else GetParent()->GetClientRect( &rcDockBarClient ); nLength = nLengthToSizeTB = rcDockBarClient.Height(); bVertSizeTB = TRUE; } _SizeToolBar( nLengthToSizeTB, bVertSizeTB ); sizeCalcLayout = _CalcSize( ( (dwMode & LM_HORZ) == 0 ) ? TRUE : FALSE ); if( bDynamic && bMultiRowLayout && (!m_bPaletteMode) ) { CSize sizeDiff( __EXT_TB_BUTTON_OUTER_MARGIN*2, __EXT_TB_BUTTON_OUTER_MARGIN*2 ); if( m_pRightBtn != NULL && m_pRightBtn->IsVisible() ) { CSize sizeRb = m_pRightBtn->Size(); sizeDiff += CSize( ((dwMode&LM_HORZ) == 0) ? 0 : sizeRb.cx, ((dwMode&LM_HORZ) == 0) ? sizeRb.cy : 0 ); } CRect rcDockBarClient; if( m_pDockBar != NULL ) m_pDockBar->GetClientRect( &rcDockBarClient ); else GetParent()->GetClientRect( &rcDockBarClient ); CSize _sizeDockBarClient = rcDockBarClient.Size(); INT nNewLengthToSizeTB = nLengthToSizeTB; if( (dwMode & LM_HORZ) == 0 ) { if( (sizeCalcLayout.cy+sizeDiff.cy) > _sizeDockBarClient.cy ) nNewLengthToSizeTB = _sizeDockBarClient.cy-sizeDiff.cy; } // if( (dwMode & LM_HORZ) == 0 ) else { if( (sizeCalcLayout.cx+sizeDiff.cx) > _sizeDockBarClient.cx ) nNewLengthToSizeTB = _sizeDockBarClient.cx-sizeDiff.cx; } // else from if( (dwMode & LM_HORZ) == 0 ) if( nNewLengthToSizeTB < 1 ) nNewLengthToSizeTB = 1; if( nNewLengthToSizeTB != nLengthToSizeTB ) { if( !m_bInsideCalcLayout ) { m_bHelperTempFullRowMode = true; m_bInsideCalcLayout = true; sizeCalcLayout = _CalcLayout( dwMode, nNewLengthToSizeTB ); if( nLengthToSizeTB != 32767 ) _RecalcPositionsImpl(); m_bInsideCalcLayout = false; return sizeCalcLayout; } } if( nLengthToSizeTB != 32767 ) _RecalcPositionsImpl(); } if( m_pRightBtn != NULL && m_pRightBtn->GetButtons().GetSize() == 0 ) { m_pRightBtn->ClearContent(); sizeCalcLayout = _CalcSize( (dwMode & LM_HORZ) == 0 ); } if( dwMode & LM_COMMIT ) if( (m_dwStyle & (CBRS_FLOATING|CBRS_SIZE_DYNAMIC)) != 0 ) if( dwMode & LM_HORZ ) m_nMRUWidth = sizeCalcLayout.cx; CRect rcInside( 0, 0, 0, 0 ); _CalcInsideRect( rcInside, (dwMode & LM_HORZ) ); sizeCalcLayout.cy -= rcInside.Height(); sizeCalcLayout.cx -= rcInside.Width(); CSize sizeCalcFixedLayout = CControlBar::CalcFixedLayout( dwMode & LM_STRETCH, (dwMode & LM_HORZ) ); sizeCalcLayout.cx = max( sizeCalcLayout.cx, sizeCalcFixedLayout.cx ); sizeCalcLayout.cy = max( sizeCalcLayout.cy, sizeCalcFixedLayout.cy ); if( IsFloating() && IsBarWithGripper() ) { int nCyGripper = min( m_rcGrip.Width(), m_rcGrip.Height() ); sizeCalcLayout.cy += nCyGripper; } } // if( _GetButtonsCountImpl() > 0 ) if( IsDockedHorizontally() ) { m_sizeDockedH = sizeCalcLayout; m_nMinHW = sizeCalcLayout.cy; } else if( IsDockedVertically() ) { m_sizeDockedV = sizeCalcLayout; m_nMinVH = sizeCalcLayout.cx; } else if( IsFloating() ) { if( sizeCalcLayout.cx < sizeDefButton.cx * 2 ) // (+ 2.23 ) sizeCalcLayout.cx = sizeDefButton.cx * 2; m_sizeFloated = sizeCalcLayout; } if( m_pDockSite == NULL ) { // specific for dialog mode if( IsDockedHorizontally() ) sizeCalcLayout.cy += 4; else sizeCalcLayout.cx += 4; } // specific for dialog mode // _RecalcPositionsImpl(); return sizeCalcLayout; } CSize CExtToolControlBar::_CalcSize( BOOL bVerticallyDocked ) { int nCountOfButtons = _GetButtonsCountImpl(); if( nCountOfButtons == 0 ) return _GetDefButtonSize(); CClientDC dc( this ); CFont * pOldFont = dc.SelectObject( OnGetToolbarFont( ( bVerticallyDocked && (!m_bPaletteMode) ) ? true : false ) ); ASSERT( pOldFont != NULL ); bool bMultiRowLayout = OnQueryMultiRowLayout(); CExtBarButton::e_wrap_t _evt = GetBtnWrapCode(); CSize sizeDefButton = _GetDefButtonSize(); CSize sizeCalc( sizeDefButton ); CPoint ptCurrent( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); int nRowExtent = sizeDefButton.cy; if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) ) nRowExtent = sizeDefButton.cx; INT nRowDistance = g_PaintManager->FixedBar_GetRowDistance( this ); // (+ v.2.22) INT nWrapCount = 0; for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->GetStyle() & TBBS_HIDDEN ) continue; if( pTBB->IsSeparator() && nBtnIdx < (nCountOfButtons-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) continue; } CSize sizeTBB( pTBB->CalculateLayout( dc, sizeDefButton, (!bVerticallyDocked) || m_bPaletteMode ) ); if( nBtnIdx == (nCountOfButtons-1) && m_pRightBtn != NULL && (IsFloating() || bMultiRowLayout) ) { ASSERT_VALID( m_pRightBtn ); ASSERT( m_pRightBtn == pTBB ); if( bMultiRowLayout ) { if( bVerticallyDocked ) sizeCalc.cy += sizeTBB.cy; else sizeCalc.cx += sizeTBB.cx; if( nWrapCount > 0 && (!m_bPaletteMode) ) m_bHelperTempFullRowMode = true; } break; } if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) ) { if( ( ptCurrent.y == __EXT_TB_BUTTON_INNER_MARGIN || pTBB->IsWrap(_evt) ) && pTBB->IsSeparator() ) sizeTBB = CSize( 0, 0 ); nRowExtent = max( nRowExtent, sizeTBB.cx ); sizeCalc.cx = max( ptCurrent.x + sizeTBB.cx, sizeCalc.cx ); sizeCalc.cy = max( ptCurrent.y + sizeTBB.cy, sizeCalc.cy ); ptCurrent.y += sizeTBB.cy; if( pTBB->IsWrap(_evt) ) { ptCurrent.y = __EXT_TB_BUTTON_INNER_MARGIN; ptCurrent.x += nRowExtent + nRowDistance; nRowExtent = sizeDefButton.cx; nWrapCount++; } } // if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) ) else { if( ( (!bVerticallyDocked) || m_bPaletteMode ) && ( ptCurrent.x == __EXT_TB_BUTTON_INNER_MARGIN || pTBB->IsWrap(_evt) ) && pTBB->IsSeparator() ) sizeTBB = CSize( 0, 0 ); nRowExtent = max( nRowExtent, sizeTBB.cy ); sizeCalc.cx = max( ptCurrent.x + sizeTBB.cx, sizeCalc.cx ); sizeCalc.cy = max( ptCurrent.y + sizeTBB.cy, sizeCalc.cy ); if( bVerticallyDocked && (!m_bPaletteMode) ) { ptCurrent.x = __EXT_TB_BUTTON_INNER_MARGIN; ptCurrent.y += sizeTBB.cy; } // if( bVerticallyDocked && (!m_bPaletteMode) ... else { ptCurrent.x += sizeTBB.cx; if( pTBB->IsWrap(_evt) ) { ptCurrent.x = __EXT_TB_BUTTON_INNER_MARGIN; ptCurrent.y += nRowExtent + nRowDistance; nRowExtent = sizeDefButton.cy; nWrapCount++; } } // else from if( bVerticallyDocked && (!m_bPaletteMode) ... } // else from if( bMultiRowLayout && bVerticallyDocked && (!m_bPaletteMode) ) } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) dc.SelectObject( pOldFont ); if( !bVerticallyDocked ) { sizeCalc.cx += m_cxLeftBorder + m_cxRightBorder; sizeCalc.cx += nRowDistance/2; // (+ v.2.22) } else { sizeCalc.cx += 1; sizeCalc.cy += m_cyTopBorder + m_cyBottomBorder; sizeCalc.cy += nRowDistance; // (+ v.2.22) } if( IsFloating() ) // (+ v.2.22) { sizeCalc.cx += 1; sizeCalc.cy += 1; } if( m_bPaletteMode && m_bPresubclassDialogMode ) { CRect rcTest( 0, 0, 1, 1 ); CSize _sizeInitial = rcTest.Size(); CalcWindowRect( &rcTest ); CSize _sizeUpdated = rcTest.Size(); ASSERT( _sizeUpdated.cx >= _sizeInitial.cx && _sizeUpdated.cy >= _sizeInitial.cy ); sizeCalc += _sizeUpdated - _sizeInitial; sizeCalc.cx += m_cxLeftBorder + m_cxRightBorder; sizeCalc.cy += m_cyTopBorder + m_cyBottomBorder; } return sizeCalc; } void CExtToolControlBar::_SizeToolBar(int nLength, BOOL bVert) { if( m_bPaletteMode ) return; int nCountOfButtons = _GetButtonsCountImpl(); if( nCountOfButtons == 0 ) return; bool bMultiRowLayout = OnQueryMultiRowLayout(); if( !( IsFloating() || bMultiRowLayout ) ) { _WrapToolBarH( bVert ? 32767 : nLength, bVert ? nLength : 32767 ); return; } CSize sizeDefButton = _GetDefButtonSize(); if( bMultiRowLayout ) { if( bVert ) { int nLengthCurr = nLength - sizeDefButton.cy; if( nLengthCurr < sizeDefButton.cy ) nLengthCurr = sizeDefButton.cy; for( ; true; ) { _WrapToolBarV( nLengthCurr ); CSize _size = _CalcSize( TRUE ); if( _size.cy <= nLength ) break; nLengthCurr -= sizeDefButton.cy / 2; if( nLengthCurr <= 0 ) break; } } // if( bVert ) else _WrapToolBarH( nLength ); return; } // if( bMultiRowLayout ) INT nMinExtent = sizeDefButton.cx / 2; ASSERT( nMinExtent > 0 ); if( bVert ) { CExtPaintManager::monitor_parms_t _mp; CExtPaintManager::stat_GetMonitorParms( _mp, this ); INT nCalcExtentMax = _mp.m_rcWorkArea.Width() + nMinExtent; // NOTES: // 1) bug was found by Eugene Pl. // 2) there is no reason to make toolbar wider // then nCalcExtentMax value // 3) loop is locked when toolbar button icons are higher // then 16px and user drags top/bottom border of a // floating toolbar with 1-row layout (and attempting // to decrease toolbar height) CSize _size( 32767, 32767 ); for( INT nCalcExtent = nMinExtent; nLength < _size.cy; nCalcExtent += nMinExtent ) { _WrapToolBarH( nCalcExtent ); _size = _CalcSize( FALSE ); if( nCalcExtent > nCalcExtentMax ) return; } _WrapToolBarH( _size.cx ); return; } INT nCountOfRowsDesired = _WrapToolBarH( nLength ); INT nCountOfRowsCurrent = _WrapToolBarH( nMinExtent ); if( nCountOfRowsCurrent == nCountOfRowsDesired || nMinExtent >= nLength ) { _WrapToolBarH( _CalcSize(FALSE).cx ); return; } while( nMinExtent < nLength ) { INT nCurrentExtent = (nMinExtent + nLength) / 2; nCountOfRowsCurrent = _WrapToolBarH( nCurrentExtent ); if( nCountOfRowsCurrent == nCountOfRowsDesired ) { nLength = nCurrentExtent; continue; } if( nMinExtent == nCurrentExtent ) { _WrapToolBarH( nLength ); break; } nMinExtent = nCurrentExtent; } _WrapToolBarH( _CalcSize(FALSE).cx ); } void CExtToolControlBar::_DraggingUpdateState( const CPoint & point, bool bForceFloatMode ) { CExtControlBar::_DraggingUpdateState( point, bForceFloatMode ); // if( IsFloating() ) // return; // if( _IsDockSiteCustomizeMode() // && (! IsSingleOnRow() ) // ) // MakeSingleOnRow(); } int CExtToolControlBar::_WrapToolBarV( int nHeight ) { ASSERT( !m_bPaletteMode ); // ASSERT( !IsFloating() ); CClientDC dc( this ); CFont * pOldFont = dc.SelectObject( OnGetToolbarFont(true) ); ASSERT( pOldFont != NULL ); CSize sizeDefButton = _GetDefButtonSize(); CRect rcClient; GetClientRect( &rcClient ); CPoint ptCurrent( rcClient.right, rcClient.top ); if( m_pRightBtn != NULL ) nHeight -= m_pRightBtn->CalculateLayout( dc, sizeDefButton, FALSE ).cy; CExtBarButton::e_wrap_t _evt = GetBtnWrapCode(); int nCountOfColumns = 1; int nCountOfButtons = _GetButtonsCountImpl(); CExtBarButton * pPrevButton = NULL; INT nRowDistance = g_PaintManager->FixedBar_GetRowDistance( this ); for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); pTBB->SetWrap( _evt, false ); if( nBtnIdx == (nCountOfButtons-1) && m_pRightBtn != NULL ) { ASSERT_VALID( m_pRightBtn ); ASSERT( m_pRightBtn == pTBB ); break; } if( pTBB->GetStyle() & TBBS_HIDDEN ) continue; if( pTBB->IsSeparator() && nBtnIdx < (nCountOfButtons-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) continue; } CSize sizeTBB = pTBB->CalculateLayout( dc, sizeDefButton, FALSE ); if( ptCurrent.y == 0 && pTBB->IsSeparator() ) sizeTBB = CSize(0, 0); if( pPrevButton != NULL && ( (ptCurrent.y + sizeTBB.cy) > nHeight ) && (! pTBB->IsSeparator() ) ) { ASSERT_VALID( pPrevButton ); pPrevButton->SetWrap( _evt ); ptCurrent.x -= sizeTBB.cx + nRowDistance; ptCurrent.y = 0; nCountOfColumns++; } ptCurrent.y += sizeTBB.cy; pPrevButton = pTBB; } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) dc.SelectObject( pOldFont ); return nCountOfColumns; } int CExtToolControlBar::_WrapToolBarH(int nWidth, int nHeight /*= 32767*/) { bool bVerticallyDocked = ((m_dwStyle & CBRS_ORIENT_HORZ) == 0) ? true : false; bool bFloatLikeMode = ( IsFloating() || nHeight == 32767 // (+ v.2.22) || OnQueryMultiRowLayout() ) ? true : false; CClientDC dc( this ); CFont* pOldFont = dc.SelectObject( OnGetToolbarFont( ( bVerticallyDocked && (!m_bPaletteMode) ) ? true : false ) ); ASSERT( pOldFont != NULL ); CSize sizeDefButton = _GetDefButtonSize(); CRect rcClient; GetClientRect( &rcClient ); CPoint ptCurrent( 0, rcClient.top ); if( (!bFloatLikeMode) && (!bVerticallyDocked) && m_pRightBtn != NULL && (!m_bPaletteMode) ) nWidth -= m_pRightBtn->CalculateLayout( dc, sizeDefButton, TRUE ).cx; CExtBarButton::e_wrap_t _evt = GetBtnWrapCode(); int nCountOfRows = 1; int nCountOfButtons = _GetButtonsCountImpl(); CExtBarButton * pPrevButton = NULL; INT nRowDistance = g_PaintManager->FixedBar_GetRowDistance( this ); for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( !m_bPaletteMode ) pTBB->SetWrap( _evt, false ); if( nBtnIdx == (nCountOfButtons-1) && m_pRightBtn != NULL ) { ASSERT_VALID( m_pRightBtn ); ASSERT( m_pRightBtn == pTBB ); break; } if( pTBB->GetStyle() & TBBS_HIDDEN ) continue; if( pTBB->IsSeparator() && nBtnIdx < (nCountOfButtons-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) continue; } CSize sizeTBB = pTBB->CalculateLayout( dc, sizeDefButton, (!bVerticallyDocked) || m_bPaletteMode ); if( ptCurrent.x == 0 && pTBB->IsSeparator() ) sizeTBB = CSize(0, 0); if( ( m_bPaletteMode && pPrevButton != NULL && pPrevButton->IsWrap( _evt ) ) || ( (!m_bPaletteMode) && bFloatLikeMode && pPrevButton != NULL && (bFloatLikeMode || ptCurrent.y + sizeTBB.cy < nHeight) && ptCurrent.x + sizeTBB.cx > nWidth && (!pTBB->IsSeparator()) ) ) { ASSERT_VALID( pPrevButton ); if( !m_bPaletteMode ) pPrevButton->SetWrap( _evt ); ptCurrent.x = 0; ptCurrent.y += sizeTBB.cy + nRowDistance; nCountOfRows++; } ptCurrent.x += sizeTBB.cx; pPrevButton = pTBB; } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) dc.SelectObject( pOldFont ); return nCountOfRows; } CSize CExtToolControlBar::_CalcDesiredMinOuterSize( BOOL bHorz ) { ASSERT_VALID( this ); if( m_bPaletteMode ) return CalcFixedLayout( FALSE, bHorz ); CSize sizeDefButton = _GetDefButtonSize(); CSize _size( 0, 0 ); if( m_pRightBtn != NULL ) { CClientDC dc( this ); CFont * pOldFont = dc.SelectObject( OnGetToolbarFont( ( (!bHorz) && (!m_bPaletteMode) ) ? true : false ) ); CSize sizeTBBRight = m_pRightBtn->CalculateLayout( dc, sizeDefButton, bHorz //|| m_bPaletteMode ); _size += sizeTBBRight; if( bHorz ) _size.cx += __EXT_TB_BUTTON_INNER_MARGIN*2; else _size.cy += __EXT_TB_BUTTON_INNER_MARGIN*2; dc.SelectObject( pOldFont ); } // if( IsFloating() ) // return _size; int nCountOfButtons = GetButtonsCount(); if( nCountOfButtons > 0 ) { CSize _sizeAdjust( 0, 0 ); CClientDC dc( this ); CFont * pOldFont = dc.SelectObject( OnGetToolbarFont( ( (!bHorz) && (!m_bPaletteMode) ) ? true : false ) ); for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->IsSeparator() ) continue; if( pTBB->GetStyle() & TBBS_HIDDEN ) continue; if( nBtnIdx == (nCountOfButtons-1) && m_pRightBtn != NULL ) { ASSERT_VALID( m_pRightBtn ); ASSERT( m_pRightBtn == pTBB ); break; } CSize sizeTBB( pTBB->CalculateLayout( dc, sizeDefButton, bHorz ) ); if( bHorz ) { if( _sizeAdjust.cx > 0 ) _sizeAdjust.cx = min( _sizeAdjust.cx, sizeTBB.cx ); else _sizeAdjust = sizeTBB; } else { if( _sizeAdjust.cy > 0 ) _sizeAdjust.cy = min( _sizeAdjust.cy, sizeTBB.cy ); else _sizeAdjust = sizeTBB; } } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) if( bHorz ) { if( _sizeAdjust.cx > 0 ) _size.cx += _sizeAdjust.cx + __EXT_TB_BUTTON_INNER_MARGIN*2; } else { if( _sizeAdjust.cy > 0 ) _size.cy += _sizeAdjust.cy + __EXT_TB_BUTTON_INNER_MARGIN*2; } dc.SelectObject( pOldFont ); } // if( nCountOfButtons > 0 ) return _size; } bool CExtToolControlBar::_GetFullRowMode() const { if( m_bHelperTempFullRowMode ) return true; return CExtControlBar::_GetFullRowMode(); } bool CExtToolControlBar::OnQueryMultiRowLayout() const { ASSERT_VALID( this ); if( m_bPresubclassDialogMode || m_pDockSite == NULL || m_bPaletteMode ) return false; if( IsFloating() ) return false; if( !_IsDockSiteCustomizeMode() ) return false; return true; } CExtControlBar::InternalAffixmentData * CExtToolControlBar::_AffixmentGetOuter() { ASSERT_VALID( this ); return &m_AffixmentData; } void CExtToolControlBar::_AffixmentSetOuter( CExtControlBar::InternalAffixmentData * pAffixmentData ) { ASSERT_VALID( this ); ASSERT( pAffixmentData != NULL ); m_AffixmentData = *pAffixmentData; } bool CExtToolControlBar::_AffixmentIsAlignedHW() const { ASSERT_VALID( this ); if( m_bPaletteMode ) return false; return true; } LRESULT CExtToolControlBar::_ContinueHelpHitTestMode( CExtToolControlBar * pBar ) { ASSERT_VALID( pBar ); ASSERT( pBar->GetSafeHwnd() != NULL && ::IsWindow(pBar->GetSafeHwnd()) ); if( pBar->m_pDockSite == NULL || (! pBar->m_pDockSite->m_bHelpMode ) ) return -3L; static bool g_bContinuedMode = false; if( g_bContinuedMode ) return -3L; HWND hWndDockSite = pBar->m_pDockSite->m_hWnd; HWND hWndBar = pBar->m_hWnd; MSG msg; g_bContinuedMode = true; LRESULT lResult = -3L; for( ; true; ) { if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { if(!( ::IsWindow( hWndDockSite ) && ::IsWindow( hWndBar ) && pBar->m_pDockSite->m_bHelpMode )) break; ::WaitMessage(); continue; } // if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) if( msg.hwnd != NULL ) { if( msg.message == WM_LBUTTONDOWN ) { CWnd * pWndPerm = CWnd::FromHandlePermanent(msg.hwnd); if( pWndPerm != NULL ) { CExtControlBar * pTestBar = DYNAMIC_DOWNCAST( CExtControlBar, pWndPerm ); if( pTestBar != NULL ) { lResult = pTestBar->DoHelpHitTest( CPoint(msg.lParam) ); if( lResult > 0 ) { PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); break; } lResult = -3L; } // if( pTestBar != NULL ) } // if( pWndPerm != NULL ) } // if( msg.message == WM_LBUTTONDOWN ) else if( msg.message == WM_MOUSEMOVE ) { CWnd * pWndPerm = CWnd::FromHandlePermanent(msg.hwnd); if( pWndPerm != NULL ) { CExtControlBar * pTestBar = DYNAMIC_DOWNCAST( CExtControlBar, pWndPerm ); if( pTestBar != NULL ) { CPoint pt( (DWORD)msg.lParam ); if( pTestBar->_OnMouseMoveMsg((UINT)msg.wParam,pt) ) { PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); continue; } // if( pTestBar->_OnMouseMoveMsg((UINT)msg.wParam,pt) ) } // if( pTestBar != NULL ) } // if( pWndPerm != NULL ) } // else if( msg.message == WM_MOUSEMOVE ) else if( msg.message == WM_COMMAND ) { if( ((HIWORD(msg.wParam))==0) || ((HIWORD(msg.wParam))==1) ) { lResult = (LRESULT)( LOWORD(msg.wParam) ); PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); break; } // if( ((HIWORD(msg.wParam))==0) || ((HIWORD(msg.wParam))==1) ) } // else if( msg.message == WM_COMMAND ) else if( msg.message == WM_SYSCOMMAND ) { switch( msg.wParam ) { case SC_SIZE: case SC_MOVE: case SC_MINIMIZE: case SC_MAXIMIZE: case SC_NEXTWINDOW: case SC_PREVWINDOW: case SC_CLOSE: case SC_RESTORE: case SC_TASKLIST: lResult = HID_BASE_COMMAND + ID_COMMAND_FROM_SC( msg.wParam ); PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); break; default: lResult = (LRESULT)( msg.wParam ); PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE); break; } break; } // else if( msg.message == WM_SYSCOMMAND ) } // if( msg.hwnd != NULL ) if( !AfxGetThread()->PumpMessage() ) break; } // for( LRESULT lResult = -3L; true; ) g_bContinuedMode = false; return lResult; } void CExtToolControlBar::GetButtonInfo(int nIndex, UINT& nID, UINT& nStyle) const { ASSERT_VALID(this); CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) { ASSERT( FALSE ); nID = 0; nStyle = 0; return; } ASSERT_VALID( pTBB ); nID = pTBB->GetCmdID(false); nStyle = pTBB->GetStyle(); } void CExtToolControlBar::SetButtonInfo(int nIndex, UINT nID, UINT nStyle) { ASSERT_VALID(this); CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) { ASSERT( FALSE ); return; } ASSERT_VALID( pTBB ); pTBB->SetCmdID( nID ); pTBB->SetStyle( nStyle ); _InvalidateButton(nIndex); UpdateWindow(); } CFont * CExtToolControlBar::OnGetToolbarFont( bool bVert ) { ASSERT_VALID(this); ASSERT( g_PaintManager->m_FontNormal.GetSafeHandle() != NULL ); ASSERT( g_PaintManager->m_FontNormalVert.GetSafeHandle() != NULL ); return ( bVert ) ? ( & g_PaintManager->m_FontNormalVert ) : ( & g_PaintManager->m_FontNormal ) ; } void CExtToolControlBar::DoPaint(CDC* pDC) { ASSERT_VALID(this); ASSERT_VALID(pDC); CExtPaintManager::stat_ExcludeChildAreas( *pDC, *this ); CExtBarButton::e_wrap_t _evt = GetBtnWrapCode(); CRect rcClient; GetClientRect( &rcClient ); CExtMemoryDC dc( pDC, &rcClient ); ASSERT( dc.GetSafeHdc() != NULL ); if( dc.GetSafeHdc() != NULL ) pDC = &dc; DoEraseBk( pDC, &rcClient ); pDC->SetTextColor( g_PaintManager->GetColor(CExtPaintManager::CLR_TEXT_OUT) ); pDC->SetBkMode( TRANSPARENT ); CFont * pOldFont = pDC->SelectObject( OnGetToolbarFont( ( ( ( m_dwStyle & CBRS_ORIENT_HORZ ) == 0 ) && (!m_bPaletteMode) ) ? true : false ) ); ASSERT( pOldFont != NULL ); int nCountOfButtons = _GetButtonsCountImpl(); INT nRowDistance = g_PaintManager->FixedBar_GetRowDistance( this ); bool bPaintRowBkMode = g_PaintManager->FixedBar_IsPaintRowBkMode( this ); bool bMultiRowLayout = OnQueryMultiRowLayout(); if( bPaintRowBkMode ) { CRect rcRowBk( rcClient ); rcRowBk.bottom = rcRowBk.top; for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( (! pTBB->IsVisible() ) || (pTBB->GetStyle() & TBBS_HIDDEN) != 0 ) continue; if( pTBB->IsSeparator() && nBtnIdx < (nCountOfButtons-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) continue; } if( !pTBB->IsSeparator() ) { CRect rcTBB = *pTBB; rcRowBk.top = min( rcRowBk.top, rcTBB.top ); rcRowBk.bottom = max( rcRowBk.bottom, rcTBB.bottom ); } if( pTBB->IsWrap(_evt) && ( m_dwStyle & CBRS_ORIENT_HORZ ) ) { if( !rcRowBk.IsRectEmpty() && pDC->RectVisible( &rcRowBk ) ) g_PaintManager->PaintFloatToolbarRowBk( *pDC, this, nBtnIdx, rcRowBk ); rcRowBk.top = rcRowBk.bottom + 1; } } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) if( !rcRowBk.IsRectEmpty() && pDC->RectVisible( &rcRowBk ) ) g_PaintManager->PaintFloatToolbarRowBk( *pDC, this, nBtnIdx, rcRowBk ); } // pre-fill row backgrounds #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtBarButton * pCustomizeActiveTBB = NULL; #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( (! pTBB->IsVisible() ) || (pTBB->GetStyle() & TBBS_HIDDEN) != 0 ) continue; if( pTBB->IsSeparator() && nBtnIdx < (nCountOfButtons-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) continue; } CRect rcTBB = *pTBB; if( !pDC->RectVisible( &rcTBB ) ) continue; if( !pTBB->IsSeparator() ) { #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( GetCustomizeSite() != NULL && pTBB->IsCustomizeActiveItem() ) { ASSERT( pCustomizeActiveTBB == NULL ); pCustomizeActiveTBB = pTBB; } // if( GetCustomizeSite() != NULL ... #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) pTBB->Paint( *pDC, ( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0 || m_bPaletteMode ) ? true : false ); continue; } // if( !pTBB->IsSeparator() ) bool bSeparatorHorz = ( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0 || m_bPaletteMode ) ? true : false; bool bSeparatorRotate = false; CRect rectSeparator( rcTBB ); if( (!bSeparatorHorz) && (!bMultiRowLayout) ) { bSeparatorHorz = true; rcTBB.OffsetRect( 0, -rcTBB.Height() ); } if( pTBB->IsWrap(_evt) ) { if( bSeparatorHorz ) { rectSeparator.left = rcClient.left; rectSeparator.right = rcClient.right; rectSeparator.top = rcTBB.bottom; rectSeparator.bottom = rectSeparator.top + nRowDistance; bSeparatorRotate = true; } // if( bSeparatorHorz ) else { rectSeparator.top = rcClient.top; rectSeparator.bottom = rcClient.bottom; rectSeparator.left = rcTBB.left - nRowDistance; rectSeparator.right = rectSeparator.left + nRowDistance; bSeparatorRotate = true; } // else from if( bSeparatorHorz ) } // if( pTBB->IsWrap(_evt) ) if( nRowDistance == 0 && bSeparatorRotate ) continue; if( bSeparatorRotate ) bSeparatorHorz = !bSeparatorHorz; rectSeparator.DeflateRect( bSeparatorHorz ? 0 : 1, bSeparatorHorz ? 1 : 0 ); if( bMultiRowLayout && m_pRightBtn != NULL && m_pRightBtn->IsVisible() && bSeparatorRotate ) { CRect rcRightBtn = *m_pRightBtn; if( bSeparatorHorz ) { if( ( m_dwStyle & CBRS_ORIENT_HORZ ) == 0 ) { if( rectSeparator.bottom > (rcRightBtn.top-__EXT_TB_BUTTON_OUTER_MARGIN) ) rectSeparator.bottom = (rcRightBtn.top-__EXT_TB_BUTTON_OUTER_MARGIN); } } // if( bSeparatorHorz ) else { if( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0 ) { if( rectSeparator.right > (rcRightBtn.left-__EXT_TB_BUTTON_OUTER_MARGIN) ) rectSeparator.right = (rcRightBtn.left-__EXT_TB_BUTTON_OUTER_MARGIN); } } // else from if( bSeparatorHorz ) } g_PaintManager->PaintSeparator( *pDC, rectSeparator, bSeparatorHorz, true, this ); // DEBUG SEPARATOR AREA PAINTING: // pDC->FillSolidRect( &rectSeparator, RGB(0,255,0) ); } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( m_pDragTargetTBB != NULL && (abs(m_nDragTargetShift)) == 1 ) { CRect rcItem = *m_pDragTargetTBB; g_PaintManager->PaintDropDivider( *pDC, rcItem, (m_nDragTargetShift < 0) ? true : false, ( ( m_dwStyle & CBRS_ORIENT_HORZ ) != 0 ) ? true : false ); } // if( m_pDragTargetTBB != NULL && (abs(m_nDragTargetShift)) == 1 ) if( m_pDragSourceTBB != NULL || pCustomizeActiveTBB != NULL ) { CRect rcItem = (pCustomizeActiveTBB != NULL) ? (*pCustomizeActiveTBB) : (*m_pDragSourceTBB) ; g_PaintManager->PaintDragSourceRect( *pDC, rcItem ); } // if( m_pDragSourceTBB != NULL ... CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite != NULL ) { CExtCustomizeCmdTreeNode * pPopupDropTargetNode = pSite->GetPopupDropTargetNode(); if( pPopupDropTargetNode != NULL ) { ASSERT_VALID( pPopupDropTargetNode ); for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( (! pTBB->IsVisible() ) || (pTBB->GetStyle() & TBBS_HIDDEN) != 0 ) continue; if( pTBB->IsSeparator() ) continue; CRect rcTBB = *pTBB; if( !pDC->RectVisible( &rcTBB ) ) continue; CExtCustomizeCmdTreeNode * pNode = pTBB->GetCmdNode(); if( ((LPVOID)pNode) != ((LPVOID)pPopupDropTargetNode) ) continue; g_PaintManager->PaintDragSourceRect( *pDC, rcTBB ); break; } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) } // if( pPopupDropTargetNode != NULL ) } // if( pSite != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) pDC->SelectObject( pOldFont ); g_PaintManager->OnPaintSessionComplete( this ); } void CExtToolControlBar::_InvalidateButton(int nIndex) { CExtBarButton * pTBB = _GetButtonPtr(nIndex); if( pTBB == NULL ) { ASSERT( FALSE ); return; } ASSERT_VALID( pTBB ); CRect rect = pTBB->Rect(); if( rect.IsRectEmpty() ) return; if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) && g_PaintManager->GetCb2DbTransparentMode(this) ) { CSize sizeToolBarRgnRounders = g_PaintManager->GetToolBarRgnRoundersSize(); rect.InflateRect( sizeToolBarRgnRounders.cx + 1, sizeToolBarRgnRounders.cy + 1 ); } #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( pTBB == m_pDragSourceTBB || pTBB == m_pDragTargetTBB ) { CSize _sizeDDM = g_PaintManager->GetDropDividerMerics(); rect.InflateRect( _sizeDDM ); rect.InflateRect( 1, 1 ); } // if( pTBB == m_pDragSourceTBB ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) InvalidateRect( &rect ); } int CExtToolControlBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const { ASSERT_VALID( this ); if( CExtToolControlBar::g_bMenuTracking || CExtPopupMenuWnd::IsMenuTracking() ) return -1; int nToolTipHit = ((CExtToolControlBar*)this)-> HitTest(point); if( nToolTipHit >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr( nToolTipHit ); ASSERT_VALID( pTBB ); if( pTBB != NULL ) { nToolTipHit = pTBB->OnToolHitTest( point, pTI ); if( nToolTipHit != -1 ) return nToolTipHit; } } // if( nToolTipHit >= 0 ) nToolTipHit = CExtControlBar::OnToolHitTest( point, pTI ); return nToolTipHit; } int CExtToolControlBar::_HitTestImpl( CPoint point, UINT nButtonStyleInclude, // = 0, // button must have style UINT nButtonStyleExclude, // = 0 // button must have not style bool bAllowFindNearest // = false // if did not hit - find nearest ) const { ASSERT_VALID( this ); if( m_hWnd == NULL || (! ::IsWindow(m_hWnd) ) ) return -1; // nowhere if( (!bAllowFindNearest) && ::GetCapture() == m_hWnd ) { CPoint ptScreen( point ); ClientToScreen( &ptScreen ); if( ::WindowFromPoint(ptScreen) != m_hWnd ) return -1; // nowhere } int nCountOfButtons = _GetButtonsCountImpl(); int nNearestIdx = -1; int nNearestDistance = 32767; bool bNearestRowMatch = false; for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr(nBtnIdx); ASSERT_VALID( pTBB ); if( (! pTBB->IsVisible() ) || (pTBB->GetStyle() & TBBS_HIDDEN) != 0 ) continue; if( pTBB->IsSeparator() && nBtnIdx < (nCountOfButtons-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) continue; } if( (pTBB->GetStyle() & nButtonStyleInclude) != nButtonStyleInclude ) continue; if( (pTBB->GetStyle() & nButtonStyleExclude) != 0 ) continue; CRect rect = *pTBB; if( rect.PtInRect(point) ) return nBtnIdx; if( !bAllowFindNearest ) continue; CPoint ptCenter = rect.CenterPoint(); double lfDX = double( point.x - ptCenter.x ); double lfDY = double( point.y - ptCenter.y ); int nDistance = (int) ::sqrt( lfDX*lfDX + lfDY*lfDY ); bool bRowMatch = false; if( (m_dwStyle & CBRS_ORIENT_HORZ) != 0 ) { bRowMatch = (rect.top <= point.y && point.y <= rect.bottom) ? true : false; } // if( (m_dwStyle & CBRS_ORIENT_HORZ) != 0 ) else { bRowMatch = (rect.left <= point.x && point.x <= rect.right) ? true : false; } // if( (m_dwStyle & CBRS_ORIENT_HORZ) != 0 ) if( (!bNearestRowMatch) && bRowMatch ) { nNearestIdx = nBtnIdx; nNearestDistance = nDistance; bNearestRowMatch = true; } // if( (!bNearestRowMatch) && bRowMatch ) else if( bNearestRowMatch == bRowMatch && nNearestDistance > nDistance ) { nNearestIdx = nBtnIdx; nNearestDistance = nDistance; } } // for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) if( bAllowFindNearest && nNearestIdx >= 0 ) return nNearestIdx; return -1; // nowhere } int CExtToolControlBar::HitTest( CPoint point // in window relative coords ) const { return _HitTestImpl( point, 0, TBBS_SEPARATOR ); } ///////////////////////////////////////////////////////////////////////////// // CExtToolControlBar message handlers BEGIN_MESSAGE_MAP(CExtToolControlBar, CExtControlBar) //{{AFX_MSG_MAP(CExtToolControlBar) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_LBUTTONDBLCLK() ON_WM_RBUTTONUP() ON_WM_CANCELMODE() ON_WM_SIZE() ON_WM_TIMER() ON_WM_CAPTURECHANGED() //}}AFX_MSG_MAP __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE() ON_REGISTERED_MESSAGE(CExtToolControlBar::g_nMsgTrackButtonMenu, OnTrackButtonMenu) END_MESSAGE_MAP() LRESULT CExtToolControlBar::OnTrackButtonMenu(WPARAM wParam,LPARAM lParam) { lParam; if( !( ::IsWindowEnabled( m_bPresubclassDialogMode ? GetOwner()->GetSafeHwnd() : _GetDockingFrameImpl()->GetSafeHwnd() ) ) ) return 0; int nCountOfButtons = GetButtonsCount(); ASSERT( nCountOfButtons >= 0 ); if( nCountOfButtons == 0 ) return 0; int nIndex = int(wParam); if( nIndex < 0 || nIndex>=nCountOfButtons ) { _CloseTrackingMenus(); return 0; } CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT_VALID( pTBB ); BOOL bDroppedMode = CExtPopupMenuWnd::IsMenuTracking(); if( !pTBB->IsAbleToTrackMenu() ) bDroppedMode = FALSE; if( bDroppedMode ) { CExtToolControlBar::TrackButtonMenu( nIndex, true ); return 0; } _CloseTrackingMenus(); if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() ) CExtMouseCaptureSink::ReleaseCapture(); return 0; } void CExtToolControlBar::OnLButtonDown(UINT nFlags, CPoint point) { if( m_bRowResizing || m_bRowRecalcing || m_bDragging ) { CExtControlBar::OnLButtonDown(nFlags, point); return; } _ActivateOnClick(); if( (m_nBtnIdxCapture = HitTest(point)) < 0 ) // nothing hit { CExtControlBar::OnLButtonDown(nFlags, point); return; } CExtBarButton * pTBB = _GetButtonPtr(m_nBtnIdxCapture); ASSERT_VALID( pTBB ); ASSERT( !(pTBB->IsSeparator()) ); #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite != NULL ) { CExtCustomizeCmdTreeNode * pNodeC = pTBB->GetCmdNode( false ); if( pNodeC != NULL ) { ASSERT_VALID( pNodeC ); bool bCustomizeMode = pSite->IsCustomizeMode(); bool bAlt = ( (::GetAsyncKeyState(VK_MENU)&0x8000) != 0 ) ? true : false; if( bAlt || bCustomizeMode ) { int nBtnDragSrc = m_nBtnIdxCapture; m_nBtnIdxCapture = -1; if( !pTBB->CanStartCommandDrag() ) return; if( bCustomizeMode ) { #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) int nWidthMin = 0, nWidthMax = 0; int nInitialResizingStateH = pTBB->GetInitialResizingStateH( point, &nWidthMin, &nWidthMax ); if( pTBB->IsCustomizeActiveItem() && nInitialResizingStateH != 0 ) { // if can resize button horizontally bool bCtrl = ( (::GetAsyncKeyState(VK_CONTROL)&0x8000) != 0 ) ? true : false; bool bShift = ( (::GetAsyncKeyState(VK_SHIFT)&0x8000) != 0 ) ? true : false; if( !( bAlt || bCtrl || bShift ) ) { CRect rcItem = pTBB->Rect(); if( !pSite->OnCmdNodeResizeH( nInitialResizingStateH, m_hWnd, pTBB, pNodeC, nWidthMin, nWidthMax, rcItem ) ) return; // resizing is canceled CFrameWnd * pFrame = GetParentFrame(); if( pFrame != NULL ) { pFrame->RecalcLayout(); pSite->ActiveItemSet( pTBB, GetSafeHwnd() ); } return; } // if( !( bAlt || bCtrl || bShift ) ) } // if can resize button horizontally #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD) pTBB->SetCustomizeActiveItem(); } // if( bCustomizeMode ) // CExtCmdItem * pCmdItem = // g_CmdManager->CmdGetPtr( // g_CmdManager->ProfileNameFromWnd( m_hWnd ), // pTBB->GetCmdID() // ); // if( pCmdItem == NULL ) // { // ASSERT( FALSE ); // return; // } CExtCustomizeCmdTreeNode * pNodeI = pTBB->GetCmdNode( true ); SendMessage( WM_CANCELMODE ); CRect rcItem( 0, 0, 1, 1 ); CExtCustomizeCmdTreeNode * pPopupDropTargetNode = pSite->GetPopupDropTargetNode(); if( bCustomizeMode && pTBB->IsAbleToTrackMenu( true ) && pPopupDropTargetNode != pNodeC ) { pSite->DropTargetPopupCancel(); pSite->DropTargetPopupCancel(); CRect rcBtn = *pTBB; ClientToScreen( &rcBtn ); CPoint ptTrack( point ); ClientToScreen( &ptTrack ); DWORD dwTrackFlags = pTBB->OnGetTrackPopupFlags(); pSite->DropTargetPopupTrack( pNodeC, rcBtn, ptTrack, dwTrackFlags ); } // if( bCustomizeMode && pTBB->IsAbleToTrackMenu() ... else pSite->DropTargetPopupCancel(); m_pDragSourceTBB = pTBB; m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; m_bHelperSeparatorAction = false; _InvalidateButton( nBtnDragSrc ); UpdateWindow(); pSite->DoDragCmdNode( this, pNodeI, pNodeC, rcItem ); m_pDragSourceTBB = NULL; m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; m_bHelperSeparatorAction = false; return; } // if( bAlt || bCustomizeMode ) } // if( pNodeC != NULL ) } // if( pSite != NULL ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) // update the button before checking for disabled status _UpdateButton(m_nBtnIdxCapture); if( pTBB->IsDisabled() || m_nBtnIdxMenuTracking == m_nBtnIdxCapture ) { m_nBtnIdxCapture = -1; return; // don't press it } pTBB->ModifyStyle( TBBS_PRESSED ); pTBB->OnPressedTrackingStart(); _InvalidateButton( m_nBtnIdxCapture ); UpdateWindow(); // immediate feedback CWnd * pCtrlTBB = pTBB->CtrlGet(); pTBB->OnClick( point, true ); if( !g_bMenuTracking ) { if( pCtrlTBB == NULL || (pCtrlTBB->GetStyle() & WS_VISIBLE) == 0 ) CExtMouseCaptureSink::SetCapture( GetSafeHwnd() ); else m_nBtnIdxCapture = -1; } else m_nBtnIdxCapture = -1; } bool CExtToolControlBar::_OnMouseMoveMsg(UINT nFlags, CPoint point) { if( CExtPopupMenuWnd::IsMenuTracking() && !CExtToolControlBar::g_bMenuTracking ) return true; if( IsFloating() && CExtMiniDockFrameWnd::g_bAutoMakeTopmostOnMouseEvent ) { CFrameWnd * pParentFrame = GetParentFrame(); if( pParentFrame != NULL ) pParentFrame->BringWindowToTop(); } if( m_bRowResizing || m_bRowRecalcing || m_bDragging ) return CExtControlBar::_OnMouseMoveMsg(nFlags, point);; if( m_nBtnIdxCapture >= 0 ) { CExtBarButton* pTBB = _GetButtonPtr(m_nBtnIdxCapture); ASSERT_VALID( pTBB ); ASSERT(!(pTBB->IsSeparator())); UINT nNewStyle = ( pTBB->GetStyle() & (~TBBS_PRESSED) ); int nBtnIdxCapture = m_nBtnIdxCapture; if( CExtMouseCaptureSink::GetCapture() != m_hWnd ) { m_nBtnIdxCapture = -1; // lost capture } else { // should be pressed if still hitting the captured button if( HitTest(point) == m_nBtnIdxCapture ) nNewStyle |= TBBS_PRESSED; } // if( (nNewStyle & TBBS_PRESSED) == 0 ) // pTBB->OnPressedTrackingStop(); // else // pTBB->OnPressedTrackingStart(); SetButtonStyle( nBtnIdxCapture, nNewStyle ); UpdateWindow(); // immediate feedback return true; } // if( m_nBtnIdxCapture >= 0 ) bool bHoverChanged = _UpdateHoverButton( point ); if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() && m_nBtnIdxHover < 0 && m_nBtnIdxMenuTracking < 0 && m_nBtnIdxCapture < 0 ) { CPoint ptScreen; if( ! ::GetCursorPos(&ptScreen) ) return false; HWND hWnd = ::WindowFromPoint(ptScreen); if( hWnd != m_hWnd ) CExtMouseCaptureSink::ReleaseCapture(); } if( bHoverChanged ) return true; return CExtControlBar::_OnMouseMoveMsg(nFlags,point); } bool CExtToolControlBar::_UpdateHoverButton( CPoint point // = CPoint(-1,-1) // default is use ::GetCursorPos() ) { if( point.x < 0 || point.y < 0 ) { if( ! ::GetCursorPos(&point) ) return false; ScreenToClient( &point ); } bool bHoverChanged = false; int nBtnIdxHoverNew = ( CExtPopupMenuWnd::TestHoverEnabledFromActiveHWND( GetSafeHwnd() ) || CExtPopupMenuWnd::IsMenuTracking() ) ? HitTest(point) : (-1); int nBtnIdxHoverOld = m_nBtnIdxHover; if( nBtnIdxHoverOld != nBtnIdxHoverNew ) { bHoverChanged = true; m_nBtnIdxHover = -1; if( nBtnIdxHoverOld >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr(nBtnIdxHoverOld); ASSERT_VALID( pTBB ); pTBB->SetHover( false ); _InvalidateButton( nBtnIdxHoverOld ); UpdateWindow(); pTBB->OnHover( point, false ); } if( CExtControlBar::FindHelpMode(this) && nBtnIdxHoverNew >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr(nBtnIdxHoverNew); if( pTBB->IsAbleToTrackMenu() && pTBB->OnHelpHitTest(point) == -3 ) m_nBtnIdxHover = nBtnIdxHoverNew; } else m_nBtnIdxHover = nBtnIdxHoverNew; if( m_nBtnIdxHover >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr(m_nBtnIdxHover); ASSERT_VALID( pTBB ); bool bEnableHoverOnNewBtn = true; if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton)) || pTBB->IsDisabled() ) { if( g_bMenuTracking ) bEnableHoverOnNewBtn = false; } #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( bEnableHoverOnNewBtn ) { CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite != NULL && ( pSite->IsCustomizeMode() || pSite->GetPopupDropTargetNode() != NULL || pSite->DraggedNodeGet() != NULL ) ) bEnableHoverOnNewBtn = false; } // if( bEnableHoverOnNewBtn ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) if( bEnableHoverOnNewBtn ) { pTBB->SetHover(); _InvalidateButton( m_nBtnIdxHover ); UpdateWindow(); pTBB->OnHover( point, true ); } } } // if( nBtnIdxHoverOld != nBtnIdxHoverNew ) return bHoverChanged; } void CExtToolControlBar::OnLButtonUp(UINT nFlags, CPoint point) { if( (m_nBtnIdxCapture < 0 && m_nBtnIdxHover < 0) || m_bRowResizing || m_bRowRecalcing || m_bDragging ) { CExtControlBar::OnLButtonUp(nFlags, point); return; // not captured } int nBtnIdxHover = m_nBtnIdxHover; int nBtnIdxCapture = m_nBtnIdxCapture; CExtBarButton * pHoverTBB = NULL; if( m_nBtnIdxHover >= 0 ) { pHoverTBB = _GetButtonPtr( m_nBtnIdxHover ); ASSERT_VALID( pHoverTBB ); m_nBtnIdxHover = -1; } // if( m_nBtnIdxHover >= 0 ) if( m_nBtnIdxCapture >= 0 ) { CExtBarButton * pTempTBB = _GetButtonPtr( nBtnIdxCapture ); ASSERT_VALID( pTempTBB ); ASSERT( !(pTempTBB->IsSeparator()) ); if( pTempTBB->IsPressedTracking() ) { pTempTBB->OnPressedTrackingStop(); _InvalidateButton( m_nBtnIdxCapture ); } m_nBtnIdxCapture = -1; CExtBarButton * pCaptureTBB = NULL; UINT nNewStyle = 0; if( nBtnIdxCapture == HitTest(point) ) { pCaptureTBB = pTempTBB; nNewStyle = ( pCaptureTBB->GetStyle() & ~TBBS_PRESSED ); // give button a chance to update _UpdateButton( nBtnIdxCapture ); // then check for disabled state if( !(pCaptureTBB->IsDisabled()) ) { if( pCaptureTBB->GetStyle() & TBBS_CHECKBOX ) { // auto check: three state => down if( nNewStyle & TBBS_INDETERMINATE ) nNewStyle &= ~TBBS_INDETERMINATE; nNewStyle ^= TBBS_CHECKED; } } // if( !(pCaptureTBB->IsDisabled()) ) } // if( nBtnIdxCapture == HitTest(point) ) CExtMouseCaptureSink::ReleaseCapture(); if( pCaptureTBB != NULL ) pCaptureTBB->OnClick( point, false ); if( !(::IsWindow(GetSafeHwnd())) ) return; if( !g_bMenuTracking ) { SetButtonStyle( nBtnIdxCapture, nNewStyle ); _UpdateButton( nBtnIdxCapture ); } // if( bUpdateBtnState ) } // if( m_nBtnIdxCapture >= 0 ) if( pHoverTBB != NULL ) { ASSERT_VALID( pHoverTBB ); pHoverTBB->SetHover( false ); pHoverTBB->OnHover( point, false ); _InvalidateButton( nBtnIdxHover ); } // if( pHoverTBB != NULL ) UpdateWindow(); // immediate feedback } void CExtToolControlBar::OnRButtonUp(UINT nFlags, CPoint point) { #if (!defined __EXT_MFC_NO_CUSTOMIZE) if( _IsDockSiteCustomizeMode() ) { CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite != NULL ) { ASSERT( pSite->IsCustomizeMode() ); INT nButton = HitTest( point ); if( nButton < 0 ) return; CExtBarButton * pTBB = _GetButtonPtr( nButton ); ASSERT_VALID( pTBB ); if( pTBB->IsSeparator() || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton)) ) return; CExtCustomizeCmdTreeNode * pNodeC = pTBB->GetCmdNode( false ); if( pNodeC == NULL ) return; ASSERT_VALID( pNodeC ); CExtCustomizeCmdTreeNode * pNodeI = pTBB->GetCmdNode( true ); #ifdef _DEBUG if( pNodeI != NULL ) { ASSERT_VALID( pNodeI ); } #endif // _DEBUG pSite->DropTargetPopupCancel(); pTBB->SetCustomizeActiveItem(); CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd(m_hWnd), pTBB->GetCmdID( false ) ); ASSERT( pCmdItem != NULL ); if( !pSite->CustomizedNodeSet( pNodeC ) ) return; Invalidate(); UpdateWindow(); bool bCanAddRemoveSeparator = false; if( nButton > 0 && (! _GetButtonPtr(nButton-1)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) ) ) bCanAddRemoveSeparator = true; bool bDelete = false; if( !pSite->OnCustomizeTreeNode( pNodeI, pNodeC, pCmdItem, bDelete, bCanAddRemoveSeparator, this ) ) { VERIFY( pSite->CustomizedNodeSet( NULL ) ); Invalidate(); UpdateWindow(); return; } VERIFY( pSite->CustomizedNodeSet( NULL ) ); if( bDelete ) { pNodeC->RemoveSelf( pCmdItem ); RemoveButton( nButton ); if( nButton > 0 && _GetButtonPtr(nButton-1)->IsSeparator() ) RemoveButton( nButton-1 ); if( nButton < (GetButtonsCount()-1) && _GetButtonPtr(nButton)->IsSeparator() ) { RemoveButton( nButton ); CExtBarButton * pTBB = _GetButtonPtr(nButton); ASSERT_VALID( pTBB ); CExtCustomizeCmdTreeNode * pNodeNext = pTBB->GetCmdNode( false ); ASSERT_VALID( pNodeNext ); pNodeNext->ModifyFlags( 0, __ECTN_GROUP_START ); } } // if( bDelete ) else { if( pNodeC->GetFlags() & __ECTN_GROUP_START ) { if( nButton > 0 && (! _GetButtonPtr(nButton-1)->IsSeparator() ) ) InsertButton( nButton, ID_SEPARATOR, FALSE ); } // if( pNodeC->GetFlags() & __ECTN_GROUP_START ) else { if( nButton > 0 && _GetButtonPtr(nButton-1)->IsSeparator() ) RemoveButton( nButton-1, FALSE ); } // else from if( pNodeC->GetFlags() & __ECTN_GROUP_START ) } // else from if( bDelete ) if( IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) ((CExtMenuControlBar*)this)->UpdateMenuBar(); if( m_pDockSite == NULL ) { _RecalcPositionsImpl(); Invalidate(); UpdateWindow(); return; } // if( m_pDockSite == NULL ) ASSERT_VALID( m_pDockSite ); if( IsFloating() ) { _RecalcLayoutImpl(); Invalidate(); UpdateWindow(); } else m_pDockSite->RecalcLayout(); return; } // if( pSite != NULL ) } // if( _IsDockSiteCustomizeMode() ) #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) CExtControlBar::OnRButtonUp(nFlags,point); } void CExtToolControlBar::OnLButtonDblClk(UINT nFlags, CPoint point) { if( m_bRowResizing || m_bRowRecalcing || m_bDragging ) { CExtControlBar::OnLButtonDblClk(nFlags, point); return; } int nBtnIdx = _HitTestImpl(point); if( nBtnIdx >= 0 ) return; CExtControlBar::OnLButtonDblClk(nFlags,point); } void CExtToolControlBar::OnCancelMode() { CExtControlBar::OnCancelMode(); // ASSERT( !CExtPopupMenuWnd::IsMenuTracking() ); bool bUpdateState = false; if( m_nBtnIdxCapture >= 0 ) { CExtBarButton* pTBB = _GetButtonPtr(m_nBtnIdxCapture); ASSERT_VALID( pTBB ); ASSERT( !(pTBB->IsSeparator()) ); if( m_nBtnIdxMenuTracking != m_nBtnIdxCapture ) { UINT nNewStyle = (pTBB->GetStyle() & ~TBBS_PRESSED); SetButtonStyle(m_nBtnIdxCapture, nNewStyle); } pTBB->OnPressedTrackingStop(); m_nBtnIdxCapture = -1; bUpdateState = true; } if( m_nBtnIdxHover >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr(m_nBtnIdxHover); ASSERT_VALID( pTBB ); pTBB->SetHover( false ); m_nBtnIdxHover = -1; bUpdateState = true; CPoint point( 0, 0 ); ::GetCursorPos( &point ); ScreenToClient( &point ); pTBB->OnHover( point, false ); } if( bUpdateState ) { if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() ) CExtMouseCaptureSink::ReleaseCapture(); Invalidate(); UpdateWindow(); } } void CExtToolControlBar::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) { CExtControlBar::OnSettingChange(uFlags,lpszSection); if( m_bPresubclassDialogMode ) { _RecalcLayoutImpl(); return; } CFrameWnd* pFrame = GetParentFrame(); ASSERT_VALID(pFrame); pFrame->DelayRecalcLayout(); } bool CExtToolControlBar::IsRightExpandButton( int nBtnIdx ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); if( pTBB == NULL ) return false; ASSERT_VALID( pTBB ); if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) return true; return false; } void CExtToolControlBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) { CWnd * pTargetUpdateWnd = pTarget; if( !m_bPresubclassDialogMode ) { CExtControlBar::OnUpdateCmdUI(pTarget, bDisableIfNoHndler); //if( CExtPopupMenuWnd::IsMenuTracking() ) // return; if( _DraggingGetBar() != NULL ) return; } // if( !m_bPresubclassDialogMode ) else { if( pTargetUpdateWnd != NULL && pTargetUpdateWnd->IsKindOf( RUNTIME_CLASS(CFrameWnd) ) ) return; //ASSERT( pTargetUpdateWnd == NULL ); // if( pTargetUpdateWnd == NULL ) pTargetUpdateWnd = GetOwner(); if( pTargetUpdateWnd == NULL ) pTargetUpdateWnd = GetParent(); ASSERT( pTargetUpdateWnd != NULL ); } if( pTargetUpdateWnd == NULL ) return; ASSERT_VALID( pTargetUpdateWnd ); if( (GetStyle() & WS_VISIBLE) == 0 ) return; int nCountOfButtons = _GetButtonsCountImpl(); for( int nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); pTBB->OnUpdateCmdUI( pTargetUpdateWnd, bDisableIfNoHndler, nBtnIdx ); } // update the dialog controls added to the toolbar UpdateDialogControls(pTargetUpdateWnd, bDisableIfNoHndler); } void CExtToolControlBar::_UpdateButton(int nIndex) { CWnd * pTarget = GetOwner(); if( pTarget == NULL && (!m_bPresubclassDialogMode) ) pTarget = GetParentFrame(); if( pTarget == NULL ) return; BOOL bDisableIfNoHandler = TRUE; if( pTarget->IsKindOf( RUNTIME_CLASS(CFrameWnd) ) ) bDisableIfNoHandler = ((CFrameWnd *)pTarget)->m_bAutoMenuEnable; CExtBarButton * pTBB = _GetButtonPtr(nIndex); ASSERT_VALID( pTBB ); pTBB->OnUpdateCmdUI( pTarget, bDisableIfNoHandler, nIndex ); } ///////////////////////////////////////////////////////////////////////////// // CExtToolControlBar diagnostics #ifdef _DEBUG void CExtToolControlBar::AssertValid() const { CExtControlBar::AssertValid(); } void CExtToolControlBar::Dump(CDumpContext& dc) const { CExtControlBar::Dump(dc); } #endif // input CRect should be client rectangle size void CExtToolControlBar::_CalcInsideRect(CRect& rect, BOOL bHorz) const { ASSERT_VALID(this); CControlBar::CalcInsideRect(rect,bHorz); } void CExtToolControlBar::_RecalcPositionsImpl() { if( GetSafeHwnd() == NULL || !::IsWindow( GetSafeHwnd() ) ) return; ASSERT_VALID(this); int nCountOfButtons = _GetButtonsCountImpl(); if( nCountOfButtons == 0 ) return; CExtBarButton::e_wrap_t _evt = GetBtnWrapCode(); BOOL bHorz = (m_dwStyle & CBRS_ORIENT_HORZ) ? TRUE : FALSE; BOOL bFloating = IsFloating(); bool bMultiRowLayout = OnQueryMultiRowLayout(); CRect rcInner; GetClientRect( &rcInner ); //rcInner.DeflateRect( __EXT_TB_BUTTON_INNER_MARGIN, __EXT_TB_BUTTON_INNER_MARGIN ); rcInner.DeflateRect( m_cxLeftBorder, m_cyTopBorder, m_cxRightBorder, m_cyBottomBorder ); CPoint ptLimitTL = rcInner.TopLeft(); CPoint ptLimitBR = rcInner.BottomRight(); CClientDC dc(this); CFont* pOldFont = dc.SelectObject( OnGetToolbarFont( ( ( ( m_dwStyle & CBRS_ORIENT_HORZ ) == 0 ) && (!m_bPaletteMode) ) ? true : false ) ); ASSERT( pOldFont != NULL ); CSize sizeDefButton = _GetDefButtonSize(); int nReviewCount = nCountOfButtons; CSize sizeTBBRight( 0, 0 ); if( m_pRightBtn != NULL ) { nReviewCount--; ASSERT_VALID( m_pRightBtn ); ASSERT( m_buttons.GetSize() > 0 ); ASSERT( m_buttons[nReviewCount] == m_pRightBtn ); m_pRightBtn->GetButtons().RemoveAll(); m_pRightBtn->ClearContent(); sizeTBBRight = m_pRightBtn->CalculateLayout( dc, sizeDefButton, bHorz || m_bPaletteMode ); if( bFloating || m_bPaletteMode ) { m_pRightBtn->Show( false ); m_pRightBtn->SetRect( CRect( ptLimitTL, sizeTBBRight ) ); if( nReviewCount == 0 ) return; } // if( bFloating || m_bPaletteMode ) else { CRect rcCalcRightBtn( bHorz ? (ptLimitBR.x - sizeTBBRight.cx) : ptLimitTL.x, bHorz ? ptLimitTL.y : (ptLimitBR.y - sizeTBBRight.cy), ptLimitBR.x, ptLimitBR.y ); m_pRightBtn->SetRect( rcCalcRightBtn ); m_pRightBtn->Show( true ); CSize sizeRounders = g_PaintManager->GetToolBarRgnRoundersSize(); if( bHorz ) rcInner.right -= sizeTBBRight.cx + __EXT_TB_BUTTON_INNER_MARGIN + sizeRounders.cx ; else rcInner.bottom -= sizeTBBRight.cy + __EXT_TB_BUTTON_INNER_MARGIN + sizeRounders.cy ; } // else from if( bFloating || m_bPaletteMode ) } // if( m_pRightBtn != NULL ) CArray < CRect, CRect > arrBtnRects; CArray < BOOL, BOOL > arrBtnVisibility; CArray < BOOL, BOOL > arrBtnSeparators; //CArray < BOOL, BOOL > arrBtnEnabled; arrBtnRects.SetSize( nReviewCount ); arrBtnVisibility.SetSize( nReviewCount ); arrBtnSeparators.SetSize( nReviewCount ); // arrBtnEnabled.SetSize( nReviewCount ); CSize sizeLastWrappedRow( 0, 0 ); bool bDockerTrasparentMode = g_PaintManager->GetCb2DbTransparentMode( this ); if( (!bFloating) && bMultiRowLayout ) { if( bHorz && bDockerTrasparentMode ) ptLimitTL.y += 1; else if( !bHorz ) { if( bDockerTrasparentMode ) ptLimitBR.x -= 2; else ptLimitBR.x -= 1; ptLimitTL.y -= 1; } } // if( (!bFloating) && bMultiRowLayout ) CPoint ptBtnPosCurr( ptLimitTL ); INT nRowExtent = sizeDefButton.cy; if( bMultiRowLayout && (!bHorz) ) { ptBtnPosCurr.x = ptLimitBR.x; nRowExtent = sizeDefButton.cx; } BOOL bSeparatorPrev = FALSE, bPostResyncAllowed = FALSE; INT nRowDistance = g_PaintManager->FixedBar_GetRowDistance( this ); for( int nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); BOOL bVisibleTBB = ( pTBB->GetStyle() & TBBS_HIDDEN ) ? FALSE : TRUE; if( pTBB->IsSeparator() && nBtnIdx < (nReviewCount-1) ) { CExtBarButton * pNextTBB = _GetButtonPtr( nBtnIdx+1 ); ASSERT_VALID( pNextTBB ); if( pNextTBB->GetStyle() & TBBS_HIDDEN ) bVisibleTBB = FALSE; } arrBtnVisibility.SetAt( nBtnIdx, bVisibleTBB ); if( !bVisibleTBB ) continue; pTBB->SetVertDocked( (bHorz || m_bPaletteMode) ? false : true ); // arrBtnEnabled.SetAt( nBtnIdx, pTBB->IsEnabled() ); BOOL bSeparator = pTBB->IsSeparator(); arrBtnSeparators.SetAt( nBtnIdx, bSeparator ); if( (bSeparatorPrev && bSeparator) || (bSeparator && nBtnIdx == 0) ) { // remove double separators arrBtnVisibility.SetAt( nBtnIdx, FALSE ); continue; } // remove double separators CSize sizeTBB = pTBB->CalculateLayout( dc, sizeDefButton, bHorz || m_bPaletteMode ); CRect rcTBB( ptBtnPosCurr, sizeTBB ); if( bMultiRowLayout && (!bHorz) ) nRowExtent = max( nRowExtent, sizeTBB.cx ); else nRowExtent = max( nRowExtent, sizeTBB.cy ); if( (bFloating || bMultiRowLayout || m_bPaletteMode) && pTBB->IsWrap(_evt) ) { if( bMultiRowLayout && (!bHorz) ) { ptBtnPosCurr.y = ptLimitTL.y; ptBtnPosCurr.x -= nRowExtent + nRowDistance; sizeLastWrappedRow = CSize( 0, 0 ); nRowExtent = sizeDefButton.cx; } // if( bMultiRowLayout && (!bHorz) ) else { ptBtnPosCurr.x = ptLimitTL.x; ptBtnPosCurr.y += nRowExtent // sizeDefButton.cy (+ v.2.22) + nRowDistance; sizeLastWrappedRow = CSize( 0, 0 ); nRowExtent = sizeDefButton.cy; } // else from if( bMultiRowLayout && (!bHorz) ) } // if( (bFloating || ... else { bool bResyncVisibleTBB = false; if( bHorz || m_bPaletteMode ) { ptBtnPosCurr.x += sizeTBB.cx; if( (!bMultiRowLayout) && ptBtnPosCurr.x > rcInner.right ) bResyncVisibleTBB = true; } // if( bHorz || m_bPaletteMode ) else { ptBtnPosCurr.y += sizeTBB.cy; if( (!bMultiRowLayout) && ptBtnPosCurr.y > rcInner.bottom ) bResyncVisibleTBB = true; } // else from if( bHorz || m_bPaletteMode ) if( bResyncVisibleTBB ) { int nSpaceToFind = ( bHorz || m_bPaletteMode ) ? ptBtnPosCurr.x - rcInner.right : ptBtnPosCurr.y - rcInner.bottom; int nBtnWithNearestWidth = nBtnIdx; int nNearestMetric = ( bHorz || m_bPaletteMode ) ? rcTBB.Width() : rcTBB.Height(); int nNearestDiff = nSpaceToFind - nNearestMetric; // hide nearest by size reviewed visible for( int nBtnIdx2 = nBtnIdx-1; nBtnIdx2 >= 0; nBtnIdx2-- ) { if( !arrBtnVisibility[nBtnIdx2] ) continue; if( arrBtnSeparators[nBtnIdx2] ) continue; #ifdef _DEBUG CExtBarButton * pTBB2 = _GetButtonPtr( nBtnIdx2 ); ASSERT( (pTBB2->GetStyle() & TBBS_HIDDEN) == 0 ); #endif // _DEBUG int nMetric = ( bHorz || m_bPaletteMode ) ? arrBtnRects[nBtnIdx2].Width() : arrBtnRects[nBtnIdx2].Height(); //if( nMetric <= nNearestMetric ) // <<-- widest search algorithm // continue; if( nMetric > nSpaceToFind ) continue; int nDiff = nSpaceToFind - nMetric; // if( !arrBtnEnabled[nBtnIdx2] ) // { // hide disabled buttons first // nNearestDiff = nDiff; // nNearestMetric = nMetric; // nBtnWithNearestWidth = nBtnIdx2; // break; // } // hide disabled buttons first if( nDiff >= nNearestDiff ) continue; nNearestDiff = nDiff; nNearestMetric = nMetric; nBtnWithNearestWidth = nBtnIdx2; } // for( int nBtnIdx2 = nBtnIdx-1; nBtnIdx2 >= 0; nBtnIdx2-- ) if( nBtnWithNearestWidth < nBtnIdx ) { ASSERT( bVisibleTBB ); arrBtnVisibility.SetAt( nBtnWithNearestWidth, FALSE ); if( (!m_bPaletteMode) && (!bMultiRowLayout) && (!IsFloating()) ) bPostResyncAllowed = TRUE; if( m_pRightBtn!=NULL && !arrBtnSeparators[nBtnWithNearestWidth] ) { CExtBarButton * pTBB2 = _GetButtonPtr( nBtnWithNearestWidth ); ASSERT_VALID( pTBB2 ); m_pRightBtn->GetButtons().Add( pTBB2 ); } if( nBtnWithNearestWidth > 0 && nBtnWithNearestWidth < nReviewCount-1 ) { // remove double separators if( arrBtnSeparators[nBtnWithNearestWidth-1] && arrBtnSeparators[nBtnWithNearestWidth+1] ) { arrBtnVisibility.SetAt( nBtnWithNearestWidth-1, FALSE ); nNearestMetric += ( bHorz || m_bPaletteMode ) ? arrBtnRects[nBtnWithNearestWidth-1].Width() : arrBtnRects[nBtnWithNearestWidth-1].Height(); } } // remove double separators rcTBB.OffsetRect( ( bHorz || m_bPaletteMode ) ? -nNearestMetric : 0, ( bHorz || m_bPaletteMode ) ? 0 : -nNearestMetric ); ( ( bHorz || m_bPaletteMode ) ? ptBtnPosCurr.x : ptBtnPosCurr.y) -= nNearestMetric; for( nBtnIdx2 = nBtnWithNearestWidth+1; nBtnIdx2 < nBtnIdx; nBtnIdx2++ ) { if( !arrBtnVisibility[nBtnIdx2] ) continue; CRect rcTBB2 = arrBtnRects[nBtnIdx2]; rcTBB2.OffsetRect( ( bHorz || m_bPaletteMode ) ? -nNearestMetric : 0, ( bHorz || m_bPaletteMode ) ? 0 : -nNearestMetric ); arrBtnRects.SetAt( nBtnIdx2, rcTBB2 ); } // for( nBtnIdx2 = nBtnWithNearestWidth+1; nBtnIdx2 < nBtnIdx; nBtnIdx2++ ) } // if( nBtnWithNearestWidth < nBtnIdx ) else { ASSERT( nBtnWithNearestWidth == nBtnIdx ); bVisibleTBB = FALSE; if( (!m_bPaletteMode) && (!bMultiRowLayout) && (!IsFloating()) ) bPostResyncAllowed = TRUE; ( (bHorz || m_bPaletteMode ) ? ptBtnPosCurr.x : ptBtnPosCurr.y) -= ( (bHorz || m_bPaletteMode ) ? sizeTBB.cx : sizeTBB.cy); } // else from if( nBtnWithNearestWidth < nBtnIdx ) } // if( bResyncVisibleTBB ) } // else from if( (bFloating || ... arrBtnVisibility.SetAt( nBtnIdx, bVisibleTBB ); if( bMultiRowLayout && (!bHorz) ) { CRect rcTBB2( rcTBB ); rcTBB2.OffsetRect( -rcTBB.Width(), 0 ); arrBtnRects.SetAt( nBtnIdx, rcTBB2 ); } else arrBtnRects.SetAt( nBtnIdx, rcTBB ); if( bVisibleTBB ) bSeparatorPrev = bSeparator; if( m_pRightBtn != NULL && (!bMultiRowLayout) && (!bVisibleTBB) && (!bSeparator) ) m_pRightBtn->GetButtons().Add( pTBB ); } // for( int nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) dc.SelectObject( pOldFont ); if( bPostResyncAllowed ) { ASSERT( !IsFloating() ); ASSERT( !m_bPaletteMode ); ASSERT( !bMultiRowLayout ); INT nVisIdx0 = -1, nVisIdx1 = -1; for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) { if( ! arrBtnVisibility[nBtnIdx] ) continue; CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) break; if( nVisIdx0 < 0 ) nVisIdx0 = nBtnIdx; nVisIdx1 = nBtnIdx; } // for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) if( nVisIdx0 >= 0 ) { ASSERT( nVisIdx1 >= nVisIdx0 ); INT nShiftMetric = 0; for( ; nVisIdx0 <= nVisIdx1; nVisIdx0++ ) { if( ! arrBtnVisibility[nVisIdx0] ) break; CExtBarButton * pTBB = _GetButtonPtr( nVisIdx0 ); ASSERT_VALID( pTBB ); ASSERT( !pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ); if( !pTBB->IsSeparator() ) break; arrBtnVisibility[nVisIdx0] = FALSE; if( bHorz ) nShiftMetric -= arrBtnRects[nVisIdx0].Width(); else nShiftMetric -= arrBtnRects[nVisIdx0].Height(); } for( ; nVisIdx1 >= nVisIdx0; nVisIdx1-- ) { if( ! arrBtnVisibility[nVisIdx1] ) break; CExtBarButton * pTBB = _GetButtonPtr( nVisIdx1 ); ASSERT_VALID( pTBB ); ASSERT( !pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ); if( !pTBB->IsSeparator() ) break; arrBtnVisibility[nVisIdx1] = FALSE; } if( nShiftMetric != 0 ) { for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) { if( ! arrBtnVisibility[nBtnIdx] ) continue; CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) break; arrBtnRects.ElementAt( nBtnIdx ).OffsetRect( bHorz ? nShiftMetric : 0, bHorz ? 0 : nShiftMetric ); } // for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) } // if( nShiftMetric != 0 ) } // if( nVisIdx0 >= 0 ) } // if( bPostResyncAllowed ) INT nRowStart = 0; INT nSizeRow = 0; int nSubRowCount = 0; bool bReAlignHorz = ( bHorz || bFloating || m_bPaletteMode ) ? true : false; if( bMultiRowLayout && (!bHorz) ) bReAlignHorz = false; for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); //BOOL bVis = arrBtnVisibility[nBtnIdx]; //if( bVis ) //{ CSize sizeTBB = *pTBB; // arrBtnRects[nBtnIdx].Size(); INT nSizeBtn = bReAlignHorz ? sizeTBB.cy : sizeTBB.cx; nSizeRow = max( nSizeRow, nSizeBtn ); //} // if( bVis ) if( ( (bFloating || bMultiRowLayout || m_bPaletteMode ) && pTBB->IsWrap(_evt) ) || nBtnIdx == nReviewCount-1 ) { for( INT nBtnIdx2 = nRowStart; nBtnIdx2 <= nBtnIdx; nBtnIdx2++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx2 ); ASSERT_VALID( pTBB ); BOOL bVis = arrBtnVisibility[nBtnIdx2]; pTBB->Show( bVis ? true : false ); if( !bVis ) continue; CRect rcBtn = arrBtnRects[nBtnIdx2]; if( pTBB->IsSeparator() ) { if( bReAlignHorz ) rcBtn.bottom = rcBtn.top + nSizeRow; else rcBtn.left = rcBtn.right - nSizeRow; } // if( pTBB->IsSeparator() ) else { if( bReAlignHorz ) rcBtn.OffsetRect( 0, ( nSizeRow - rcBtn.Height() ) / 2 ); else rcBtn.OffsetRect( - ( nSizeRow - rcBtn.Width() ) / 2, 0 ); } // else from if( pTBB->IsSeparator() ) if( bFloating || bMultiRowLayout ) rcBtn.OffsetRect( 0, 1 ); pTBB->SetRect( rcBtn ); } nRowStart = nBtnIdx + 1; nSizeRow = 0; nSubRowCount++; } } // for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) if( nSubRowCount == 1 && (!m_bPaletteMode) && (!bFloating) && (!bMultiRowLayout) ) { CRect rcBarClient; GetClientRect( &rcBarClient ); nSizeRow = bHorz ? rcBarClient.Height() : rcBarClient.Width() ; for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); BOOL bVis = arrBtnVisibility[nBtnIdx]; if( !bVis ) continue; CRect rcBtn( pTBB->Rect() ); if( pTBB->IsSeparator() ) { if( bHorz ) { rcBtn.top = m_cyTopBorder; rcBtn.bottom = m_cyBottomBorder + nSizeRow; } // if( bHorz ) else { rcBtn.left = m_cxLeftBorder; rcBtn.right = m_cxRightBorder + nSizeRow; } // else from if( bHorz ) } // if( pTBB->IsSeparator() ) else { rcBtn.OffsetRect( bHorz ? 0 : ( ( nSizeRow - rcBtn.Width() ) / 2 - rcBtn.left) , bHorz ? ( ( nSizeRow - rcBtn.Height() ) / 2 - rcBtn.top) : 0 ); } // else from if( pTBB->IsSeparator() ) pTBB->SetRect( rcBtn ); } // for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) } // if( nSubRowCount == 1 && (!m_bPaletteMode) && (!bFloating) && (!bMultiRowLayout) ) else if( !m_bPaletteMode ) { // just re-align separators in each row INT nRowMinLoc = 0, nRowMaxLoc = 0; INT nRowStart = 0; for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->IsVisible() && (pTBB->GetStyle() & TBBS_HIDDEN) == 0 ) { CRect rcTBB = *pTBB; if( nBtnIdx == nRowStart ) { if( bHorz ) { nRowMinLoc = rcTBB.top; nRowMaxLoc = rcTBB.bottom; } // if( bHorz ) else { nRowMinLoc = rcTBB.left; nRowMaxLoc = rcTBB.right; } // else from if( bHorz ) } // if( nBtnIdx == nRowStart ) else { if( bHorz ) { nRowMinLoc = min( nRowMinLoc, rcTBB.top ); nRowMaxLoc = max( nRowMaxLoc, rcTBB.bottom ); } // if( bHorz ) else { nRowMinLoc = min( nRowMinLoc, rcTBB.left ); nRowMaxLoc = max( nRowMaxLoc, rcTBB.right ); } // else from if( bHorz ) } // else from if( nBtnIdx == nRowStart ) } // if( pTBB->IsVisible() ... if( (! pTBB->IsWrap(_evt) ) && nBtnIdx != (nReviewCount-1) ) continue; for( INT nBtnIdx2 = nRowStart; nBtnIdx2 < nBtnIdx; nBtnIdx2++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx2 ); ASSERT_VALID( pTBB ); if( (! pTBB->IsVisible() ) || (pTBB->GetStyle() & TBBS_HIDDEN) != 0 || (! pTBB->IsSeparator() ) ) continue; CRect rcTBB = *pTBB; if( bHorz ) { rcTBB.top = nRowMinLoc; rcTBB.bottom = nRowMaxLoc; rcTBB.InflateRect( 0, bDockerTrasparentMode ? 2 : 1 ); } // if( bHorz ) else { rcTBB.left = nRowMinLoc; rcTBB.right = nRowMaxLoc; rcTBB.InflateRect( bDockerTrasparentMode ? 2 : 1, 0, bDockerTrasparentMode ? 3 : 2, 0 ); } // else from if( bHorz ) pTBB->SetRect( rcTBB ); } // for( INT nBtnIdx2 = nRowStart; nBtnIdx2 < nBtnIdx; nBtnIdx2++ ) nRowStart = nBtnIdx + 1; } // for( nBtnIdx = 0; nBtnIdx < nReviewCount; nBtnIdx++ ) } // just re-align separators in each row // remove TBBS_HIDDEN in right menu if( (!m_bPaletteMode) && m_pRightBtn != NULL ) { int nMenuCount = m_pRightBtn->GetButtons().GetSize(); for( int nMenuIdx = 0; nMenuIdx < nMenuCount; ) { CExtBarButton * pTBB = m_pRightBtn->GetButtons(). GetAt( nMenuIdx ); ASSERT_VALID( pTBB ); if( pTBB->GetStyle() & TBBS_HIDDEN ) { m_pRightBtn->GetButtons().RemoveAt( nMenuIdx ); nMenuCount--; } // if( pTBB->GetStyle() & TBBS_HIDDEN ) else nMenuIdx++; } // for( int nMenuIdx = 0; nMenuIdx < nMenuCount; ) } // if( (!m_bPaletteMode) && m_pRightBtn != NULL ) if( m_pRightBtn != NULL && m_bPresubclassDialogMode ) { if( m_pRightBtn->GetButtons().GetSize() == 0 ) m_pRightBtn->ModifyStyle( TBBS_DISABLED, 0 ); else m_pRightBtn->ModifyStyle( 0, TBBS_DISABLED ); } // insert separators into right button if( bFloating || bMultiRowLayout || m_bPaletteMode || bMultiRowLayout || m_pRightBtn == NULL || ( m_pRightBtn != NULL && m_pRightBtn->GetButtons().GetSize() == 0 ) ) { return; } int nHiddenCount = m_pRightBtn->GetButtons().GetSize(); if( nHiddenCount < 2 ) return; int nEndMeasure = nHiddenCount-1; for( int iHidden = 0; iHidden < nEndMeasure; iHidden++ ) { CExtBarButton * pTbbHidden0 = m_pRightBtn->GetButtons().GetAt(iHidden); ASSERT( pTbbHidden0 != NULL ); ASSERT( ! pTbbHidden0->IsSeparator() ); ASSERT( (! pTbbHidden0->IsVisible()) && (pTbbHidden0->GetStyle() & TBBS_HIDDEN) == 0 ); CExtBarButton * pTbbHidden1 = m_pRightBtn->GetButtons().GetAt(iHidden+1); ASSERT( pTbbHidden1 != NULL ); ASSERT( ! pTbbHidden1->IsSeparator() ); ASSERT( (! pTbbHidden1->IsVisible()) && (pTbbHidden1->GetStyle() & TBBS_HIDDEN) == 0 ); CExtBarButton * pTbbSeparatorToInsert = NULL; int nIdx0=-1,nIdx1=-1; for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB == pTbbHidden0 ) { nIdx0 = nBtnIdx; ASSERT( nIdx1 < 0 ); continue; } if( nIdx0 >= 0 && pTBB->IsSeparator() && pTbbSeparatorToInsert == NULL ) pTbbSeparatorToInsert = pTBB; if( pTBB == pTbbHidden1 ) { nIdx1 = nBtnIdx; ASSERT( nIdx0 >= 0 && nIdx0 < nIdx1 ); break; } } ASSERT( nIdx0 < nIdx1 && nIdx0 >= 0 && nIdx0 < nCountOfButtons && nIdx1 >= 0 && nIdx1 < nCountOfButtons ); if( (nIdx0+1) == nIdx1 ) continue; if( pTbbSeparatorToInsert != NULL ) { nEndMeasure++; iHidden++; m_pRightBtn->GetButtons().InsertAt( iHidden, pTbbSeparatorToInsert ); } } // for( int iHidden = 0; iHidden < nEndMeasure; iHidden++ ) } DWORD CExtToolControlBar::RecalcDelayShow(AFX_SIZEPARENTPARAMS* lpLayout) { DWORD dwRes = CControlBar::RecalcDelayShow( lpLayout ); if( (!IsFloating()) && IsVisible() ) _RecalcPositionsImpl(); return dwRes; } void CExtToolControlBar::OnSize(UINT nType, int cx, int cy) { CExtControlBar::OnSize(nType, cx, cy); _RecalcLayoutImpl(); } void CExtToolControlBar::_RecalcLayoutImpl() { if( GetSafeHwnd() == NULL || !::IsWindow( GetSafeHwnd() ) ) return; CExtControlBar::_RecalcLayoutImpl(); _RecalcPositionsImpl(); if( m_bPresubclassDialogMode ) { Invalidate(); UpdateWindow(); return; } if( m_pDockSite != NULL && m_pDockBar != NULL && OnQueryMultiRowLayout() && m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) ((CExtDockOuterBar*)m_pDockBar)->_DelayDockSiteRecalc(); } LRESULT CExtToolControlBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if( message == WM_TIMER && wParam == 0x444 ) { if( CExtPopupMenuWnd::IsMenuTracking() || g_bMenuTracking || _DraggingGetBar() != NULL ) return 0; KillTimer( 0x444 ); CFrameWnd * pFrame = GetParentFrame(); if( pFrame != NULL ) { ASSERT_VALID( pFrame ); pFrame->RecalcLayout(); } return 0; } // if( message == WM_TIMER && wParam == 0x444 ) if( message == WM_WINDOWPOSCHANGED ) { #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite != NULL && pSite->IsCustomizeMode() ) pSite->ActiveItemSet(); #endif //(!defined __EXT_MFC_NO_CUSTOMIZE) _RecalcLayoutImpl(); } // if( message == WM_WINDOWPOSCHANGED ) return CExtControlBar::WindowProc(message,wParam,lParam); } void CExtToolControlBar::OnTimer(UINT nIDEvent) { CExtControlBar::OnTimer(nIDEvent); } void CExtToolControlBar::_SwitchMenuTrackingIndex( int iNewMenuTrackingIndex // = -1 ) { if( m_nBtnIdxMenuTracking >= 0 ) { CExtBarButton * pTBB = _GetButtonPtr( m_nBtnIdxMenuTracking ); ASSERT_VALID( pTBB ); ASSERT( !(pTBB->IsSeparator()) ); UINT nNewStyle = pTBB->GetStyle() & ~(TBBS_PRESSED|TBBS_CHECKED|TBBS_INDETERMINATE); pTBB->SetStyle( nNewStyle ); pTBB->OnPressedTrackingStop(); _InvalidateButton( m_nBtnIdxMenuTracking ); m_nBtnIdxMenuTracking = -1; } // if( m_nBtnIdxMenuTracking >= 0 ) if( iNewMenuTrackingIndex >= 0 ) { m_nBtnIdxMenuTracking = iNewMenuTrackingIndex; CExtBarButton * pTBB = _GetButtonPtr( m_nBtnIdxMenuTracking ); ASSERT_VALID( pTBB ); ASSERT( !(pTBB->IsSeparator()) ); UINT nNewStyle = pTBB->GetStyle() & ~(TBBS_CHECKED|TBBS_INDETERMINATE); nNewStyle |= TBBS_PRESSED; pTBB->SetStyle( nNewStyle ); pTBB->OnPressedTrackingStart(); _InvalidateButton( m_nBtnIdxMenuTracking ); } // if( iNewMenuTrackingIndex >= 0 ) UpdateWindow(); } CExtToolControlBar * CExtToolControlBar::_GetMenuTrackingBar() { CSingleLock _slCsCB( &g_csCB ); _slCsCB.Lock(); CExtToolControlBar * pRetVal = NULL; for( INT iBar=0; iBar<g_AllBars.GetSize(); ++iBar ) { CExtControlBar * pBar = g_AllBars[iBar]; ASSERT_VALID( pBar ); CExtToolControlBar * pToolControlBar = DYNAMIC_DOWNCAST(CExtToolControlBar,pBar); if( pToolControlBar == NULL ) continue; if( pToolControlBar->m_nBtnIdxMenuTracking >= 0 ) { pRetVal = pToolControlBar; break; } } _slCsCB.Unlock(); return NULL; } void CExtToolControlBar::_CloseTrackingMenus() { g_bMenuTracking = false; CSingleLock _slCsCB( &g_csCB ); _slCsCB.Lock(); for( INT iBar=0; iBar<g_AllBars.GetSize(); ++iBar ) { CExtControlBar * pBar = g_AllBars[iBar]; ASSERT_VALID( pBar ); CExtToolControlBar * pToolControlBar = DYNAMIC_DOWNCAST(CExtToolControlBar,pBar); if( pToolControlBar == NULL ) continue; pToolControlBar->_SwitchMenuTrackingIndex(); } _slCsCB.Unlock(); // CExtPopupMenuWnd::CancelMenuTracking(); // CWnd::CancelToolTips(); if( !CExtPopupMenuSite::g_DefPopupMenuSite.IsEmpty() && !CExtPopupMenuSite::g_DefPopupMenuSite.IsShutdownMode() ) CExtPopupMenuSite::g_DefPopupMenuSite->PostMessage( WM_CANCELMODE ); CWnd::CancelToolTips(); // TO FIX: can be tracked other menu // ASSERT( !CExtPopupMenuWnd::IsMenuTracking() ); } void CExtToolControlBar::_CbPaintCombinedContent( LPVOID pCookie, CDC & dc, const CWnd & refWndMenu, const CRect & rcExcludeArea, // in screen coords int eCombineAlign // CExtPopupMenuWnd::e_combine_align_t values ) { pCookie; dc; refWndMenu; rcExcludeArea; eCombineAlign; ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( refWndMenu.GetSafeHwnd() != NULL ); CExtToolControlBar * pBar = (CExtToolControlBar *)pCookie; ASSERT_VALID( pBar ); ASSERT( pBar->IsKindOf(RUNTIME_CLASS(CExtToolControlBar)) ); ASSERT( eCombineAlign != CExtPopupMenuWnd::__CMBA_NONE ); if( rcExcludeArea.IsRectEmpty() ) return; if( pBar->m_nBtnIdxMenuTracking < 0 ) return; ASSERT( pBar->m_nBtnIdxMenuTracking < pBar->GetButtonsCount() ); CExtBarButton * pTBB = pBar->_GetButtonPtr( pBar->m_nBtnIdxMenuTracking ); ASSERT_VALID( pTBB ); if( g_PaintManager->GetCb2DbTransparentMode(pTBB) && pTBB->IsKindOf( RUNTIME_CLASS(CExtBarContentExpandButton) ) && (! pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) && (! pBar->m_bPresubclassDialogMode ) && CExtPaintManager::stat_GetBPP() > 8 ) return; UINT nStyle = pTBB->GetStyle(); bool bHover = pTBB->IsHover(); pTBB->SetHover( false ); pTBB->ModifyStyle( 0, TBBS_PRESSED|TBBS_CHECKED|TBBS_CHECKBOX ); CRect rcClientBar,rcClientExcludeArea; pBar->GetClientRect( &rcClientBar ); pBar->ClientToScreen( &rcClientBar ); refWndMenu.GetClientRect( &rcClientExcludeArea ); refWndMenu.ClientToScreen( &rcClientExcludeArea ); CPoint ptOffset = rcClientBar.TopLeft() - rcClientExcludeArea.TopLeft() ; CPoint ptViewportOrg = dc.GetViewportOrg(); dc.SetViewportOrg( ptOffset ); bool bHorz = pBar->IsDockedVertically() ? false : true; pTBB->Paint(dc,bHorz); dc.SetViewportOrg( ptViewportOrg ); pTBB->SetHover( bHover ); pTBB->SetStyle(nStyle); } CExtBarButton * CExtToolControlBar::GetButton( int nIndex ) { return _GetButtonPtr( nIndex ); } CExtBarContentExpandButton * CExtToolControlBar::GetRightButton() { return m_pRightBtn; } void CExtToolControlBar::OnCaptureChanged(CWnd *pWnd) { if( (m_nBtnIdxCapture >= 0 || m_nBtnIdxHover >= 0) && pWnd != this ) SendMessage( WM_CANCELMODE ); CExtControlBar::OnCaptureChanged(pWnd); } BOOL CExtToolControlBar::InitContentExpandButton() { if( m_pRightBtn != NULL ) return TRUE; m_pRightBtn = OnCreateBarRightBtn(); if( m_pRightBtn == NULL ) return FALSE; ASSERT_VALID( m_pRightBtn ); ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn ); m_buttons.Add( m_pRightBtn ); return TRUE; } bool CExtToolControlBar::_CanDockToInnerCircles() const { return false; } bool CExtToolControlBar::_CanDockToTabbedContainers( CExtControlBar * pDestBar ) const { pDestBar; return false; } void CExtToolControlBar::ToggleDocking() { ASSERT_VALID( this ); ASSERT_VALID( m_pDockSite ); ASSERT_VALID( m_pDockBar ); #ifdef _DEBUG if( !IsFloating() ) { ASSERT_KINDOF( CExtDockBar, m_pDockBar ); } #endif // _DEBUG ASSERT( m_pDockContext != NULL ); m_pDockContext->ToggleDocking(); CFrameWnd * pFrame = _GetDockingFrameImpl(); ASSERT_VALID( pFrame ); pFrame->DelayRecalcLayout(); _RecalcNcArea(); } CExtBarButton::e_wrap_t CExtToolControlBar::GetBtnWrapCode() const { ASSERT_VALID( this ); if( m_bPresubclassDialogMode || GetSafeHwnd() == NULL || ( ! ::IsWindow(GetSafeHwnd()) ) || IsFloating() ) return CExtBarButton::e_wrap_t::__EVT_FLOAT; if( IsDockedVertically() ) return CExtBarButton::e_wrap_t::__EVT_VERT; return CExtBarButton::e_wrap_t::__EVT_HORZ; } #if (!defined __EXT_MFC_NO_CUSTOMIZE) bool CExtToolControlBar::_IsDockSiteCustomizeMode() const { CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite == NULL ) // return CExtControlBar::_IsDockSiteCustomizeMode(); return false; return pSite->IsCustomizeMode(); } CExtCustomizeSite * CExtToolControlBar::GetCustomizeSite() { ASSERT_VALID( this ); return m_pCustomizeSite; } CExtCustomizeSite * CExtToolControlBar::GetCustomizeSite() const { ASSERT_VALID( this ); return ((CExtToolControlBar*)this)->GetCustomizeSite(); } bool CExtToolControlBar::OnCustomizeRegisterBar( CExtCustomizeSite * pCustomizeSite ) { ASSERT_VALID( this ); ASSERT( m_pCustomizeSite == NULL ); // should called only once ASSERT( pCustomizeSite != NULL ); if( (! m_bCustomizationAllowed ) || m_bPaletteMode ) return false; m_pCustomizeSite = pCustomizeSite; return true; } void CExtToolControlBar::OnCustomizeGetBarInfo( CExtCustomizeSite::CToolBarCustomizeInfo * pInfo ) { ASSERT_VALID( this ); ASSERT( m_pCustomizeSite != NULL ); ASSERT( pInfo != NULL ); ASSERT( m_hWnd != NULL && ::IsWindow(m_hWnd) ); UINT nBarID = (UINT)GetDlgCtrlID(); CExtCmdItem * pCmd = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd(m_hWnd), nBarID ); if( pCmd != NULL ) pInfo->m_strDisplayName = pCmd->OnGetToolBarCustomizeName(); if( pInfo->m_strDisplayName.IsEmpty() ) { #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) CExtLocalResourceHelper _LRH; #endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) if( !pInfo->m_strDisplayName.LoadString(nBarID) ) { //#if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) // ASSERT( FALSE ); //#endif // #if (defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) int nTextLen = GetWindowTextLength(); if( nTextLen > 0 ) { GetWindowText( pInfo->m_strDisplayName.GetBuffer(nTextLen+1), nTextLen+1 ); pInfo->m_strDisplayName.ReleaseBuffer(); } // if( nTextLen > 0 ) if( pInfo->m_strDisplayName.IsEmpty() ) pInfo->m_strDisplayName.Format( _T("Toolbar #%08X"), nBarID ); } // if( !pInfo->m_strDisplayName.LoadString(nBarID) ) } // if( pInfo->m_strDisplayName.IsEmpty() ) if( pInfo->m_pHelperBarButtonsI != NULL ) { CExtCustomizeSite * pCustomizeSite = GetCustomizeSite(); ASSERT( pCustomizeSite != NULL ); ASSERT_VALID( pInfo->m_pHelperBarButtonsI ); ASSERT( pInfo->m_pHelperBarButtonsI->GetCmdID() == ((UINT)GetDlgCtrlID()) ); ASSERT( pInfo->m_pHelperBarButtonsI->GetNodeCount() == 0 ); pInfo->m_pHelperBarButtonsI->SetTextUser( pInfo->m_strDisplayName ); INT nCountOfButtons = _GetButtonsCountImpl(); for( INT nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); pTBB->OnCustomizeNodeInit( pCustomizeSite, pInfo->m_pHelperBarButtonsI ); } // for( INT nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) } // if( pInfo->m_pHelperBarButtonsI != NULL ) } void CExtToolControlBar::OnCustomizeUpdateInitialBarState( CExtCustomizeCmdTreeNode * pParentNode, bool bRecalcLayout ) { ASSERT_VALID( this ); ASSERT_VALID( pParentNode ); ASSERT( m_pCustomizeSite != NULL ); INT nNodeCount = pParentNode->GetNodeCount(); INT nCountOfButtons = _GetButtonsCountImpl(); ASSERT( nNodeCount <= nCountOfButtons ); INT nNodePos = 0; for( INT nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); CExtCustomizeCmdTreeNode * pCmdNodeI = pTBB->GetCmdNode( true ); if( pCmdNodeI == NULL ) continue; ASSERT( !pTBB->IsSeparator() ); ASSERT_VALID( pCmdNodeI ); CExtCustomizeCmdTreeNode * pCmdNodeC = pParentNode->ElementAt( nNodePos++ ); ASSERT_VALID( pCmdNodeC ); // pTBB->SetCustomizedCmdNode( pCmdNodeC ); // re-init spec buttons pTBB = m_pCustomizeSite->OnCreateToolbarButton( this, pCmdNodeI, pCmdNodeI ); ASSERT_VALID( pTBB ); VERIFY( InsertSpecButton( nBtnIdx, pTBB, FALSE ) ); pTBB->SetBasicCmdNode( pCmdNodeI ); pTBB->SetCustomizedCmdNode( pCmdNodeC ); pTBB->OnCustomizeUpdateProps(); RemoveButton( nBtnIdx + 1 ); } // for( INT nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ ) if( bRecalcLayout ) _RecalcLayoutImpl(); } void CExtToolControlBar::OnCustomizeModeEnter() { ASSERT_VALID( this ); if( m_pDockSite == NULL || m_pDockBar == NULL || (! m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) ) return; ASSERT_VALID( m_pDockSite ); ASSERT_VALID( m_pDockBar ); CExtCustomizeSite * pSite = GetCustomizeSite(); if( pSite != NULL ) pSite->RegisterCommandDropTarget( this, this ); if( (! IsDocked() ) || _GetFullRowMode() ) return; INT nCountOfButtons = _GetButtonsCountImpl(); if( nCountOfButtons == 0 ) return; if( m_pRightBtn == NULL ) return; if( m_pRightBtn->GetButtons().GetSize() == 0 ) return; INT nOwnIdxInDocker = m_pDockBar->FindBar(this); ASSERT( 0 < nOwnIdxInDocker && nOwnIdxInDocker < (m_pDockBar->m_arrBars.GetSize()-1) ); if( m_pDockBar->m_arrBars[nOwnIdxInDocker+1] != NULL ) m_pDockBar->m_arrBars.InsertAt( nOwnIdxInDocker+1, (CControlBar *)NULL ); if( m_pDockBar->m_arrBars[nOwnIdxInDocker-1] != NULL ) m_pDockBar->m_arrBars.InsertAt( nOwnIdxInDocker, (CControlBar *)NULL ); Invalidate(); } void CExtToolControlBar::OnCustomizeModeLeave() { ASSERT_VALID( this ); } void CExtToolControlBar::OnCustomizeListBoxUpdate( CExtCustomizeToolbarsListBox * pWndList ) { ASSERT_VALID( this ); ASSERT_VALID( pWndList ); CExtControlBar::OnCustomizeListBoxUpdate( pWndList ); } DROPEFFECT CExtToolControlBar::OnCustomizeTargetOver( CExtCustomizeSite::CCmdDragInfo & _dragInfo, CPoint point, DWORD dwKeyState ) { ASSERT_VALID( this ); ASSERT( !_dragInfo.IsEmpty() ); _dragInfo; if( m_pDockBar != NULL && IsFloating() ) GetParentFrame()->SetWindowPos( &CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE ); //CExtCustomizeSite * pSite = GetCustomizeSite(); // ASSERT( pSite != NULL ); //CExtCustomizeCmdTreeNode * pPopupDropTargetNode = // pSite->GetPopupDropTargetNode(); // if( pSite->IsCustomizeMode() // && m_pDragTargetTBB != NULL // && m_pDragTargetTBB->IsAbleToTrackMenu() // && pPopupDropTargetNode == m_pDragTargetTBB->GetCmdNode() // ) // pSite->DropTargetPopupCancel(); int nCountTest = _GetButtonsCountImpl(); int nCountReal = nCountTest; if( m_pRightBtn != NULL ) { nCountTest--; ASSERT( nCountTest >= 0 ); } if( nCountTest > 0 && _GetButtonPtr(0)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) ) { nCountTest--; ASSERT( nCountTest >= 0 ); } if( nCountReal > 1 && _GetButtonPtr( ( m_pRightBtn != NULL ) ? (nCountReal-2) : (nCountReal-1) )->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) ) { nCountTest--; ASSERT( nCountTest >= 0 ); } if( nCountTest == 0 ) { if( (dwKeyState & MK_CONTROL) != NULL ) return DROPEFFECT_COPY; return DROPEFFECT_MOVE; } if( m_pDragTargetTBB != NULL ) _InvalidateButton( _GetIndexOf(m_pDragTargetTBB) ); int nHitIdx = _HitTestImpl( point, 0, 0, true ); if( nHitIdx < 0 ) { m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; UpdateWindow(); return DROPEFFECT_NONE; } CExtBarButton * pHitTBB = _GetButtonPtr( nHitIdx ); ASSERT_VALID( pHitTBB ); if( pHitTBB->IsSeparator() ) { nHitIdx--; if( nHitIdx < 0 ) { m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; UpdateWindow(); return DROPEFFECT_NONE; } pHitTBB = _GetButtonPtr( nHitIdx ); ASSERT_VALID( pHitTBB ); if( pHitTBB->IsSeparator() ) { ASSERT( FALSE ); // double separators?! m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; UpdateWindow(); return DROPEFFECT_NONE; } // if( pHitTBB->IsSeparator() ) } // if( pHitTBB->IsSeparator() ) m_nDragTargetShift = pHitTBB->CalculateDropOverEffect( point, _dragInfo ); if( m_nDragTargetShift == 0 ) { m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; UpdateWindow(); return DROPEFFECT_NONE; } // if( m_nDragTargetShift == 0 ) if( m_pDragTargetTBB != pHitTBB ) { m_pDragTargetTBB = pHitTBB; _InvalidateButton( _GetIndexOf(m_pDragTargetTBB) ); } UpdateWindow(); if( (dwKeyState & MK_CONTROL) != NULL ) return DROPEFFECT_COPY; return DROPEFFECT_MOVE; } void CExtToolControlBar::OnCustomizeTargetLeave() { ASSERT_VALID( this ); if( m_pDragTargetTBB == NULL ) return; _InvalidateButton( _GetIndexOf(m_pDragTargetTBB) ); m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; UpdateWindow(); } bool CExtToolControlBar::OnCustomizeTargetDrop( CExtCustomizeSite::CCmdDragInfo & _dragInfo, CPoint point, DROPEFFECT de ) { // returns true if drop with any effect // has been performed ASSERT_VALID( this ); ASSERT( !_dragInfo.IsEmpty() ); _dragInfo; point; ASSERT( de == DROPEFFECT_NONE || de == DROPEFFECT_MOVE || de == DROPEFFECT_COPY ); if( de == DROPEFFECT_NONE // || m_pDragTargetTBB == NULL // || m_nDragTargetShift == 0 ) return false; if( m_pDragTargetTBB == NULL ) { CExtCustomizeSite * pSite = GetCustomizeSite(); ASSERT( pSite != NULL ); int nInsertPos = 0; if( GetButtonsCount() > 0 && _GetButtonPtr(0)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) ) nInsertPos = 1; pSite->OnInsertToolbarCmdNode( _dragInfo, this, nInsertPos, true ); if( m_pDockBar != NULL && IsFloating() ) { GetParentFrame()->RecalcLayout(); Invalidate(); } return true; } // if( m_pDragTargetTBB == NULL ) ASSERT_VALID( m_pDragTargetTBB ); int nBtn = _GetIndexOf(m_pDragTargetTBB); ASSERT( 0 <= nBtn && nBtn < _GetButtonsCountImpl() ); _InvalidateButton( nBtn ); bool bSeparatorAdd = false; bool bSeparatorRemove = false; if( de == DROPEFFECT_MOVE ) { if( m_pDragSourceTBB == m_pDragTargetTBB ) { if( m_nDragTargetShift == -2 ) return false; // no reinsert if( m_nDragTargetShift < 0 ) { // if remove separator if( nBtn > 0 && _GetButtonPtr(nBtn-1)->IsSeparator() ) bSeparatorRemove = true; else return false; // no reinsert } // if remove separator else { // if add separator if( ( nBtn > 1 || ( nBtn == 1 && (! _GetButtonPtr(0)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) ) ) ) && (! _GetButtonPtr(nBtn-1)->IsSeparator() ) ) bSeparatorAdd = true; else return false; // no reinsert } // if add separator } // if( m_pDragSourceTBB == m_pDragTargetTBB ) else if( m_pDragSourceTBB != NULL && nBtn > 0 && m_nDragTargetShift < 0 && _GetIndexOf(m_pDragSourceTBB) == (nBtn-1) && (!( nBtn == 2 && _GetButtonPtr(0)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )) ) { if( ( nBtn > 1 && (! _GetButtonPtr(nBtn-2)->IsSeparator() ) ) || nBtn <= 1 ) { // avoid unwanted separator insert bSeparatorAdd = true; nBtn--; } // avoid unwanted separator insert } } // if( de == DROPEFFECT_MOVE ) if( bSeparatorRemove ) { CExtBarButton * pModifyTBB = _GetButtonPtr(nBtn); ASSERT_VALID( pModifyTBB ); CExtCustomizeCmdTreeNode * pNode = pModifyTBB->GetCmdNode(); ASSERT_VALID( pNode ); pNode->ModifyFlags( 0, __ECTN_GROUP_START ); RemoveButton(nBtn-1); UpdateWindow(); if( m_pDockBar != NULL && IsFloating() ) { GetParentFrame()->RecalcLayout(); Invalidate(); } m_bHelperSeparatorAction = true; } // if( bSeparatorRemove ) else if( bSeparatorAdd ) { CExtBarButton * pModifyTBB = _GetButtonPtr(nBtn); ASSERT_VALID( pModifyTBB ); CExtCustomizeCmdTreeNode * pNode = pModifyTBB->GetCmdNode(); ASSERT_VALID( pNode ); pNode->ModifyFlags( __ECTN_GROUP_START ); InsertButton(nBtn); UpdateWindow(); if( m_pDockBar != NULL && IsFloating() ) { GetParentFrame()->RecalcLayout(); Invalidate(); } m_bHelperSeparatorAction = true; } // else if( bSeparatorAdd ) else { // if command drop int nInsertPos = (m_nDragTargetShift < 0) ? nBtn : (nBtn+1); m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; UpdateWindow(); //InsertButton( nInsertPos, pCmdItem->m_nCmdID ); CExtCustomizeSite * pSite = GetCustomizeSite(); ASSERT( pSite != NULL ); pSite->OnInsertToolbarCmdNode( _dragInfo, this, nInsertPos, true ); if( m_pDockBar != NULL && IsFloating() ) { GetParentFrame()->RecalcLayout(); Invalidate(); } } // if command drop return true; } void CExtToolControlBar::OnCustomizeSourceDragComplete( DROPEFFECT de, bool bCanceled, bool * p_bNoResetActiveItem ) { ASSERT_VALID( this ); ASSERT_VALID( m_pDragSourceTBB ); ASSERT( p_bNoResetActiveItem != NULL ); ASSERT( de == DROPEFFECT_NONE || de == DROPEFFECT_MOVE || de == DROPEFFECT_COPY ); int nBtnSrc = _GetIndexOf(m_pDragSourceTBB); if( (!bCanceled) && (!m_bHelperSeparatorAction) ) { // if( de == DROPEFFECT_NONE // || ( de == DROPEFFECT_MOVE // && m_pDragSourceTBB != m_pDragTargetTBB // ) // ) CExtBarButton * pHtCurrTBB = NULL; if( GetButtonsCount() > 0 ) { CPoint point( 0, 0 ); ::GetCursorPos( &point ); ScreenToClient( &point ); INT nButton = HitTest( point ); if( nButton >= 0 ) pHtCurrTBB = _GetButtonPtr( nButton ); } // if( GetButtonsCount() > 0 ) if( de == DROPEFFECT_NONE || de == DROPEFFECT_MOVE ) { if( m_pDragSourceTBB == m_pDragTargetTBB || m_pDragSourceTBB == pHtCurrTBB ) { // if keep source button active m_pDragSourceTBB = NULL; if( _IsDockSiteCustomizeMode() ) *p_bNoResetActiveItem = true; } // if keep source button active else { // if remove source button m_pDragSourceTBB = NULL; CExtCustomizeSite * pSite = GetCustomizeSite(); ASSERT( pSite != NULL ); CExtCustomizeCmdTreeNode * pNode = pSite->DraggedNodeGet(); ASSERT_VALID( pNode ); ASSERT( ((LPVOID)pNode) == ((LPVOID)_GetButtonPtr(nBtnSrc)->GetCmdNode(false)) ); if( pSite->GetPopupDropTargetNode() == pNode ) { pSite->DropTargetPopupCancel(); ASSERT( pSite->GetPopupDropTargetNode() != pNode ); } RemoveButton( nBtnSrc ); pSite->DraggedNodeSet( NULL ); CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd(m_hWnd), pNode->GetCmdID( false ) ); ASSERT( pCmdItem != NULL ); ASSERT_VALID( pNode->GetParentNode() ); int nOwnNodeIndex = pNode->GetOwnIndex(); int nSiblingCount = pNode->GetParentNode()->GetNodeCount(); bool bRemovePrevSeparator = (pNode->GetFlags() & __ECTN_GROUP_START) ? true : false; bool bRemoveNextSeparator = false; if( bRemovePrevSeparator && nOwnNodeIndex < (nSiblingCount-1) ) { ASSERT( nOwnNodeIndex > 0 ); ASSERT( nBtnSrc > 0 ); if( (pNode->GetParentNode()->ElementAt(nOwnNodeIndex+1) ->GetFlags()&__ECTN_GROUP_START) == 0 ) { pNode->GetParentNode()->ElementAt(nOwnNodeIndex+1) ->ModifyFlags( __ECTN_GROUP_START ); bRemovePrevSeparator = false; } } if( nOwnNodeIndex == 0 && nSiblingCount > 1 && (pNode->GetParentNode()->ElementAt(1) ->GetFlags()&__ECTN_GROUP_START) != 0 ) { pNode->GetParentNode()->ElementAt(1)->ModifyFlags( 0, __ECTN_GROUP_START ); bRemoveNextSeparator = true; } pNode->RemoveSelf( pCmdItem ); if( bRemoveNextSeparator ) { ASSERT( _GetButtonPtr(nBtnSrc)->IsSeparator() ); RemoveButton( nBtnSrc ); } if( bRemovePrevSeparator ) { ASSERT( _GetButtonPtr(nBtnSrc-1)->IsSeparator() ); RemoveButton( nBtnSrc-1 ); } if( m_pDockBar != NULL && IsFloating() ) { GetParentFrame()->RecalcLayout(); Invalidate(); } } // if remove source button } // if( de == DROPEFFECT_NONE || de == DROPEFFECT_MOVE ) else _InvalidateButton( nBtnSrc ); } // if( (!bCanceled) && (!m_bHelperSeparatorAction) ) else _InvalidateButton( nBtnSrc ); m_pDragSourceTBB = NULL; m_pDragTargetTBB = NULL; m_nDragTargetShift = 0; m_bHelperSeparatorAction = false; UpdateWindow(); } INT CExtToolControlBar::OnCustomizeCalcCmdNodePos( INT nButtonPos, bool * p_bReinitGroupStart // = NULL ) { ASSERT_VALID( this ); if( p_bReinitGroupStart != NULL ) (*p_bReinitGroupStart) = false; INT nButtonsCount = _GetButtonsCountImpl(); ASSERT( nButtonPos <= nButtonsCount ); if( nButtonsCount == 0 ) return 0; INT nCmdPos = 0; for( INT nBtnIdx = 0; nBtnIdx < nButtonPos; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->GetCmdNode() == NULL ) continue; ASSERT( !pTBB->IsSeparator() ); ASSERT_VALID( pTBB->GetCmdNode() ); nCmdPos ++; } // for( INT nBtnIdx = 0; nBtnIdx < nButtonPos; nBtnIdx++ ) ASSERT( nCmdPos <= nButtonsCount ); if( p_bReinitGroupStart != NULL && nButtonPos > 0 ) { CExtBarButton * pTBB = _GetButtonPtr( nButtonPos - 1 ); ASSERT_VALID( pTBB ); if( pTBB->IsSeparator() ) (*p_bReinitGroupStart) = true; } // if( p_bReinitGroupStart != NULL && nButtonPos > 0 ) return nCmdPos; } bool CExtToolControlBar::OnCustomizeCanShowHideButtons() { ASSERT_VALID( this ); if( m_bPaletteMode || IsKindOf(RUNTIME_CLASS(CExtPanelControlBar)) || IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) || (! IsVisible() ) ) return false; INT nButtonsCount = _GetButtonsCountImpl(); if( nButtonsCount == 0 ) return false; for( INT nBtnIdx = 0; nBtnIdx < nButtonsCount; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->IsSeparator() || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton)) || pTBB->GetCmdNode() == NULL ) continue; ASSERT_VALID( pTBB->GetCmdNode() ); if( (pTBB->GetCmdNode()->GetFlags()&__ECTN_TBB_CANNOT_HIDE) != 0 ) continue; return true; } // for( INT nBtnIdx = 0; nBtnIdx < nButtonPos; nBtnIdx++ ) return false; } void CExtToolControlBar::OnCustomizeInitShowHideButtonMenu( CExtPopupMenuWnd * pFolder ) { ASSERT_VALID( this ); ASSERT( OnCustomizeCanShowHideButtons() ); ASSERT_VALID( pFolder ); ASSERT( IsVisible() ); INT nButtonsCount = _GetButtonsCountImpl(); ASSERT( nButtonsCount > 0 ); INT nInsertPos = 0; for( INT nBtnIdx = 0; nBtnIdx < nButtonsCount; nBtnIdx++ ) { CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx ); ASSERT_VALID( pTBB ); if( pTBB->IsSeparator() || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) || pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiRightButton)) || pTBB->GetCmdNode() == NULL ) continue; ASSERT_VALID( pTBB->GetCmdNode() ); if( (pTBB->GetCmdNode()->GetFlags()&__ECTN_TBB_CANNOT_HIDE) != 0 ) continue; VERIFY( pFolder->ItemInsert( pTBB->GetCmdID(false), nInsertPos ) ); CExtPopupMenuWnd::MENUITEMDATA & mi = pFolder->ItemGetInfo( nInsertPos ); mi.SetForceEnabled(); mi.SetExtraMark( (CExtPopupMenuWnd::MENUITEMDATA::pCbItemClick) stat_CbXtraMarkState ); mi.LParamSet( (LPARAM)pTBB ); pFolder->ItemSetDisplayed( nInsertPos, true ); mi.SetExtraChecked( ( (pTBB->GetStyle() & TBBS_HIDDEN) != 0 ) ? false : true ); nInsertPos++; } // for( INT nBtnIdx = 0; nBtnIdx < nButtonPos; nBtnIdx++ ) } bool CExtToolControlBar::stat_CbXtraMarkState( CExtPopupMenuWnd * pPopup, LPVOID pItemData ) { ASSERT_VALID( pPopup ); pPopup; ASSERT( pItemData != NULL ); CExtPopupMenuWnd::MENUITEMDATA & mi = *((CExtPopupMenuWnd::MENUITEMDATA *)pItemData); ASSERT( mi.IsExtraMark() ); mi.SetExtraChecked( !mi.IsExtraChecked() ); CExtBarButton * pTBB = (CExtBarButton*)mi.LParamGet(); ASSERT_VALID( pTBB ); ASSERT_VALID( pTBB->GetBar() ); ASSERT( pTBB->GetBar()->_GetIndexOf(pTBB) >= 0 ); //pTBB->RedrawButton( false ); if( mi.IsExtraChecked() ) { pTBB->ModifyStyle( 0, TBBS_HIDDEN ); pTBB->Show( true ); } // if( mi.IsExtraChecked() ) else { pTBB->ModifyStyle( TBBS_HIDDEN, 0 ); pTBB->Show( false ); } // else from if( mi.IsExtraChecked() ) CExtToolControlBar * pBar = pTBB->GetBar(); ASSERT_VALID( pBar ); pBar->_RecalcPositionsImpl(); pBar->Invalidate(); pBar->UpdateWindow(); if( pBar->m_bPresubclassDialogMode ) return true; // not important if( pBar->m_pDockSite != NULL && pBar->IsFloating() ) { CFrameWnd * pFrame = pBar->GetParentFrame(); ASSERT_VALID( pFrame ); ASSERT_KINDOF( CMiniDockFrameWnd, pFrame ); pFrame->RecalcLayout(); return true; // not important } pBar->SetTimer( 0x444, 1, NULL ); return true; // not important } bool CExtToolControlBar::stat_CbCmdDeliver( CExtPopupMenuWnd * pPopup, LPVOID pItemData ) { ASSERT_VALID( pPopup ); pPopup; ASSERT( pItemData != NULL ); CExtPopupMenuWnd::MENUITEMDATA & mi = *((CExtPopupMenuWnd::MENUITEMDATA *)pItemData); if( mi.IsExtraMark() ) return false; if( mi.IsSeparator() ) return false; if( mi.IsPopup() ) return false; if( mi.GetCmdID() != ID_EXT_RESET_TOOLBAR ) return false; ASSERT( pPopup->GetSafeHwnd() != NULL && ::IsWindow( pPopup->GetSafeHwnd() ) ); CExtCustomizeSite * pSite = CExtCustomizeSite::GetCustomizeSite( pPopup->GetSafeHwnd() ); if( pSite == NULL ) return false; CExtToolControlBar * pBar = (CExtToolControlBar *) mi.LParamGet(); ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( pSite->BarIsRegistered( pBar ) ); pSite->BarDefCmdTargetSet( pBar ); return false; } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) ///////////////////////////////////////////////////////////////////////////// // CExtPanelControlBar IMPLEMENT_DYNCREATE(CExtPanelControlBar, CExtToolControlBar) CExtPanelControlBar::CExtPanelControlBar() : m_rcMargins( 5, 5, 5, 5 ) { m_bPaletteMode = true; #if (!defined __EXT_MFC_NO_CUSTOMIZE) m_bVisibleInCustomizeListBox = false; #endif // (!defined __EXT_MFC_NO_CUSTOMIZE) } CExtPanelControlBar::~CExtPanelControlBar() { } BEGIN_MESSAGE_MAP(CExtPanelControlBar, CExtToolControlBar) //{{AFX_MSG_MAP(CExtPanelControlBar) ON_WM_SIZE() ON_WM_PAINT() ON_WM_WINDOWPOSCHANGED() ON_WM_SETFOCUS() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CExtToolControlBar message handlers CSize CExtPanelControlBar::CalcDynamicLayout(int nLength, DWORD dwMode) { ASSERT_VALID( this ); if( (nLength == -1) && !(dwMode & (LM_MRUWIDTH|LM_COMMIT)) && (dwMode & (LM_HORZDOCK|LM_VERTDOCK)) ) return CalcFixedLayout( dwMode & LM_STRETCH, dwMode & LM_HORZDOCK ); ASSERT( (dwMode&(LM_HORZ|LM_HORZDOCK)) || (!(dwMode&LM_HORZDOCK)) ); CSize sizeCalcLayout = _CalcLayout( dwMode, nLength ); return sizeCalcLayout; } CSize CExtPanelControlBar::CalcFixedLayout( BOOL bStretch, BOOL bHorz ) { ASSERT_VALID( this ); DWORD dwMode = bStretch ? LM_STRETCH : 0; dwMode |= bHorz ? LM_HORZ : 0; ASSERT( (dwMode&(LM_HORZ|LM_HORZDOCK)) || (!(dwMode&LM_HORZDOCK)) ); CSize sizeCalcLayout = _CalcLayout( dwMode ); _RecalcNcArea(); return sizeCalcLayout; } CSize CExtPanelControlBar::_CalcLayout( DWORD dwMode, int nLength // = -1 ) { ASSERT_VALID( this ); dwMode; nLength; CSize sizeCalcLayout( 0, 0 ); if( !IsFloating() ) { sizeCalcLayout += CSize( 2, 2 ); bool bGripperAtTop = false; if( IsBarWithGripper( &bGripperAtTop ) ) { CSize sizeGrip = _GetRectGrip().Size(); if( bGripperAtTop ) sizeCalcLayout.cy += sizeGrip.cy; else sizeCalcLayout.cx += sizeGrip.cx; } } if( IsDockedHorizontally() ) { sizeCalcLayout += _QueryFixedBarNewSize( __FSQ_DOCKED_H ); SetInitDesiredSizeHorizontal( sizeCalcLayout ); m_nMinHW = sizeCalcLayout.cx; } else if( IsDockedVertically() ) { sizeCalcLayout += _QueryFixedBarNewSize( __FSQ_DOCKED_V ); SetInitDesiredSizeVertical( sizeCalcLayout ); m_nMinVH = sizeCalcLayout.cy; } else if( IsFloating() ) { sizeCalcLayout += _QueryFixedBarNewSize( __FSQ_FLOATING ); SetInitDesiredSizeFloating( sizeCalcLayout ); } else { sizeCalcLayout += CSize( 20, 20 ); } if( m_pDockSite == NULL ) { // specific for dialog mode if( IsDockedHorizontally() ) sizeCalcLayout.cy += 4; else sizeCalcLayout.cx += 4; } // specific for dialog mode return sizeCalcLayout; } INT CExtPanelControlBar::_CalcDesiredMinHW() const { ASSERT_VALID( this ); CSize sizeCalcLayout = _QueryFixedBarNewSize( __FSQ_DOCKED_H ); return sizeCalcLayout.cx; } CSize CExtPanelControlBar::_CalcDesiredMinOuterSize( BOOL bHorz ) { ASSERT_VALID( this ); CSize sizeCalcLayout = _QueryFixedBarNewSize( bHorz ? __FSQ_DOCKED_H : __FSQ_DOCKED_V ); return sizeCalcLayout; } INT CExtPanelControlBar::_CalcDesiredMinVH() const { ASSERT_VALID( this ); CSize sizeCalcLayout = _QueryFixedBarNewSize( __FSQ_DOCKED_V ); return sizeCalcLayout.cy; } CSize CExtPanelControlBar::_CalcDesiredMinFloatedSize() const { ASSERT_VALID( this ); CSize sizeCalcLayout = _QueryFixedBarNewSize( __FSQ_FLOATING ); return sizeCalcLayout; } CSize CExtPanelControlBar::_QueryFixedBarNewSize( CExtPanelControlBar::e_fixed_bar_size_query_t eWhichSizeNeedToKnow ) const { CSize sizeResult( OnQueryFixedBarNewSize(eWhichSizeNeedToKnow) ); // if( eWhichSizeNeedToKnow != __FSQ_FLOATING ) // { // CRect rcClient, rcWnd; // GetClientRect( &rcClient ); // GetWindowRect( &rcWnd ); // CSize sizeClient( rcClient.Size() ); // CSize sizeWnd( rcWnd.Size() ); // sizeResult += sizeWnd; // sizeResult -= sizeClient; // } return sizeResult; } CSize CExtPanelControlBar::OnQueryFixedBarNewSize( CExtPanelControlBar::e_fixed_bar_size_query_t eWhichSizeNeedToKnow ) const { ASSERT_VALID( this ); eWhichSizeNeedToKnow; //CSize sizeResult; // switch( eWhichSizeNeedToKnow ) // { // case __FSQ_DOCKED_H: // sizeResult = CSize( 20, 20 ); // break; // case __FSQ_DOCKED_V: // sizeResult = CSize( 20, 20 ); // break; // default: // ASSERT( eWhichSizeNeedToKnow == __FSQ_FLOATING ); // sizeResult = CSize( 20, 20 ); // break; // } // return sizeResult; CSize sizeResult( _GetChildSize() ); CRect rcMargins = OnQueryFixedBarChildWindowMargins(); sizeResult.cx += rcMargins.left + rcMargins.right; sizeResult.cy += rcMargins.top + rcMargins.bottom; return sizeResult; } CRect CExtPanelControlBar::OnQueryFixedBarChildWindowMargins() const { ASSERT_VALID( this ); return m_rcMargins; } CSize CExtPanelControlBar::_GetChildSize() const { ASSERT_VALID( this ); if( GetSafeHwnd() == NULL || (! ::IsWindow(GetSafeHwnd())) ) return CSize( 0, 0 ); CWnd * pWndChild = GetWindow( GW_CHILD ); if( pWndChild->GetSafeHwnd() == NULL || (! ::IsWindow(pWndChild->GetSafeHwnd())) ) return CSize( 0, 0 ); CRect rcChild; pWndChild->GetWindowRect( &rcChild ); CSize sizeChild( rcChild.Size() ); return sizeChild; } void CExtPanelControlBar::_RepositionChild( bool bRedraw // = true ) { ASSERT_VALID( this ); CWnd * pWndChild = GetWindow( GW_CHILD ); if( pWndChild == NULL ) return; CRect rcMargins = OnQueryFixedBarChildWindowMargins(); CRect rcRequired, rcReal; GetClientRect( &rcRequired ); rcRequired.DeflateRect( &rcMargins ); pWndChild->GetWindowRect( &rcReal ); ScreenToClient( &rcReal ); // if( rcReal == rcRequired ) if( rcReal.TopLeft() == rcRequired.TopLeft() ) return; rcReal.OffsetRect( - rcReal.TopLeft() + rcRequired.TopLeft() ); pWndChild->MoveWindow( &rcReal, // &rcRequired, bRedraw ? TRUE : FALSE ); } void CExtPanelControlBar::OnSize(UINT nType, int cx, int cy) { ASSERT_VALID( this ); CExtToolControlBar::OnSize(nType, cx, cy); _RepositionChild(); } void CExtPanelControlBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) { ASSERT_VALID( this ); CExtToolControlBar::OnWindowPosChanged(lpwndpos); _RepositionChild(); } void CExtPanelControlBar::OnSetFocus(CWnd* pOldWnd) { ASSERT_VALID( this ); CExtToolControlBar::OnSetFocus(pOldWnd); CWnd * pWndChild = GetWindow( GW_CHILD ); if( pWndChild == NULL ) return; pWndChild->SetFocus(); } void CExtPanelControlBar::OnPaint() { ASSERT_VALID( this ); CPaintDC dcPaint( this ); CExtMemoryDC dc( &dcPaint ); CRect rcClient; GetClientRect( &rcClient ); CWnd * pWndChild = GetWindow( GW_CHILD ); if( pWndChild == NULL ) { // if no child - fill entire client area bool bFillBk = true; if( g_PaintManager->GetCb2DbTransparentMode(this) && g_PaintManager->PaintDockerBkgnd( dc, this ) ) bFillBk = false; if( bFillBk ) dc.FillSolidRect( &rcClient, g_PaintManager->GetColor( CExtPaintManager::CLR_3DFACE_OUT ) ); // // DEBUG BLOCK BEGIN: - fill gradient & draw text // // rcClient.DeflateRect( 2, 2 ); // COLORREF clrFc = g_PaintManager->GetColor(COLOR_3DFACE); // COLORREF clrDk = g_PaintManager->GetColor(COLOR_3DDKSHADOW); // COLORREF clrHi = g_PaintManager->GetColor(COLOR_3DHILIGHT); // COLORREF clrLo = g_PaintManager->GetColor(COLOR_3DSHADOW); // dc.Draw3dRect( &rcClient, clrFc, clrDk ); // rcClient.DeflateRect( 1, 1 ); // dc.Draw3dRect( &rcClient, clrHi, clrLo ); // rcClient.DeflateRect( 1, 1 ); // dc.Draw3dRect( &rcClient, clrLo, clrHi ); // rcClient.DeflateRect( 1, 1 ); // dc.Draw3dRect( &rcClient, clrDk, clrFc ); // rcClient.DeflateRect( 2, 2 ); // UINT nDockBarID = GetSafeDockBarDlgCtrlID(); // CExtPaintManager::stat_PaintGradientRect( // dc, // rcClient, // RGB( 128, 128, 255 ), // RGB( 0, 0, 0 ), // (nDockBarID==AFX_IDW_DOCKBAR_LEFT || nDockBarID==AFX_IDW_DOCKBAR_RIGHT) // ? true : false // ); // // CRect rcDrawText( rcClient ); // rcDrawText.DeflateRect( 5, 5 ); // CRect rcDrawTextShadow( rcDrawText ); // CExtSafeString sText; // CFont * pFont = &g_PaintManager->m_FontNormal; // switch( nDockBarID ) // { // case AFX_IDW_DOCKBAR_TOP: // sText = _T("Docked at top"); // rcDrawTextShadow.OffsetRect( 1, 1 ); // break; // case AFX_IDW_DOCKBAR_BOTTOM: // sText = _T("Docked at bottom"); // rcDrawTextShadow.OffsetRect( 1, 1 ); // break; // case AFX_IDW_DOCKBAR_LEFT: // sText = _T("Docked at left"); // pFont = &g_PaintManager->m_FontNormalVert; // rcDrawText.OffsetRect( rcDrawText.Width(), 0 ); // rcDrawText.OffsetRect( -1, -2 ); // rcDrawTextShadow = rcDrawText; // rcDrawTextShadow.OffsetRect( 1, 1 ); // break; // case AFX_IDW_DOCKBAR_RIGHT: // sText = _T("Docked at right"); // pFont = &g_PaintManager->m_FontNormalVert; // rcDrawText.OffsetRect( rcDrawText.Width(), 0 ); // rcDrawText.OffsetRect( -1, -2 ); // rcDrawTextShadow = rcDrawText; // rcDrawTextShadow.OffsetRect( 1, 1 ); // break; // default: // ASSERT( nDockBarID == AFX_IDW_DOCKBAR_FLOAT ); // sText = _T("Floating"); // rcDrawTextShadow.OffsetRect( 1, 1 ); // break; // } // switch( nDockBarID ) // CFont * pOldFont = dc.SelectObject( pFont ); // int nOldBkMode = dc.SetBkMode( TRANSPARENT ); // COLORREF clrOldTextColor = dc.SetTextColor( RGB(128,128,128) ); // dc.DrawText( sText, &rcDrawTextShadow, DT_SINGLELINE|DT_NOCLIP ); // dc.SetTextColor( RGB(255,255,255) ); // dc.DrawText( sText, &rcDrawText, DT_SINGLELINE|DT_NOCLIP ); // dc.SetTextColor( clrOldTextColor ); // dc.SetBkMode( nOldBkMode ); // dc.SelectObject( pOldFont ); // // DEBUG BLOCK END: - fill gradient & draw text // } // if no child - fill entire client area else { // if has child - fill margins around child // CRect rcMargins = OnQueryFixedBarChildWindowMargins(); // CRect rcExclude( rcClient ); // rcExclude.DeflateRect( &rcMargins ); // dc.ExcludeClipRect( &rcExclude ); CExtPaintManager::stat_ExcludeChildAreas( dc, m_hWnd ); bool bFillBk = true; if( g_PaintManager->GetCb2DbTransparentMode(this) && g_PaintManager->PaintDockerBkgnd( dc, this ) ) bFillBk = false; if( bFillBk ) dc.FillSolidRect( &rcClient, g_PaintManager->GetColor( CExtPaintManager::CLR_3DFACE_OUT ) ); dc.SelectClipRgn( NULL ); } // if has child - fill margins around child } bool CExtPanelControlBar::_AffixmentIsAlignedHW() const { ASSERT_VALID( this ); return false; } LRESULT CExtPanelControlBar::DoHelpHitTest( CPoint ptHelpHitTest ) { ASSERT_VALID( this ); return CExtControlBar::DoHelpHitTest( ptHelpHitTest ); } bool CExtPanelControlBar::OnQueryMultiRowLayout() const { ASSERT_VALID( this ); return false; } #if (!defined __EXT_MFC_NO_CUSTOMIZE) CExtCustomizeSite * CExtPanelControlBar::GetCustomizeSite() { ASSERT_VALID( this ); return NULL; } bool CExtPanelControlBar::OnCustomizeRegisterBar( CExtCustomizeSite * pCustomizeSite ) { ASSERT_VALID( this ); ASSERT( pCustomizeSite != NULL ); pCustomizeSite; return false; } void CExtPanelControlBar::OnCustomizeModeEnter() { ASSERT_VALID( this ); } void CExtPanelControlBar::OnCustomizeModeLeave() { ASSERT_VALID( this ); } void CExtPanelControlBar::OnCustomizeListBoxUpdate( CExtCustomizeToolbarsListBox * pWndList ) { ASSERT_VALID( this ); ASSERT_VALID( pWndList ); CExtToolControlBar::OnCustomizeListBoxUpdate( pWndList ); } #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)